理解示例类
如果你编写过JMS应用程序,就很容易理解JNDIUtil 和 Tester示例类(从http://assets.devx.com/sourcecode/WebSphereMQ_JMSSource&Classes.zip下载Java源文件和编译好的类),你创建的JMS管理对象隐藏了所有厂家专利实现。
JNDIUtil类
JNDIUtil包括使用名字通过JNDI查找检索对象的方法,参考清单1,你可以使用这个类中的方法检索你在MQ管理器中定义的JMS对象的引用情况。
清单1 JNDIUtil.java
package devx.articles.mqjms;
// JMS 类
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
// JNDI 类
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
// 标准 Java类
import java.util.Hashtable;
/**
*
* A wrapper class for JNDI calls
*
*/
public class JNDIUtil
{
private Context context;
public JNDIUtil(String icf, String url) throws JMSException, NamingException
{
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, icf );
environment.put(Context.PROVIDER_URL, url);
context= new InitialContext( environment );
}
/**
*
* @param ObjName Object Name to be retrieved
* @return Retrieved Object
* @throws NamingException
*/
private Object getObjectByName(String ObjName) throws NamingException
{
return context.lookup( ObjName );
}
/**
* A convenience method that returns QueueConnectionFactory objects (no casting required)
* @param factoryName QueueConnectionFactory JNDI name
* @return QueueConnectionFactory object
* @throws NamingException
*/
public QueueConnectionFactory getQueueConnectionFactory(String factoryName) throws NamingException
{
return (QueueConnectionFactory) getObjectByName(factoryName);
}
/**
* A convenience method that returns Queue objects (no casting required)
* @param queueName
* @return
* @throws NamingException
*/
public Queue getQueue(String queueName) throws NamingException
{
return (Queue) getObjectByName(queueName);
}
}
// JMS 类
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
// JNDI 类
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
// 标准 Java类
import java.util.Hashtable;
/**
*
* A wrapper class for JNDI calls
*
*/
public class JNDIUtil
{
private Context context;
public JNDIUtil(String icf, String url) throws JMSException, NamingException
{
Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, icf );
environment.put(Context.PROVIDER_URL, url);
context= new InitialContext( environment );
}
/**
*
* @param ObjName Object Name to be retrieved
* @return Retrieved Object
* @throws NamingException
*/
private Object getObjectByName(String ObjName) throws NamingException
{
return context.lookup( ObjName );
}
/**
* A convenience method that returns QueueConnectionFactory objects (no casting required)
* @param factoryName QueueConnectionFactory JNDI name
* @return QueueConnectionFactory object
* @throws NamingException
*/
public QueueConnectionFactory getQueueConnectionFactory(String factoryName) throws NamingException
{
return (QueueConnectionFactory) getObjectByName(factoryName);
}
/**
* A convenience method that returns Queue objects (no casting required)
* @param queueName
* @return
* @throws NamingException
*/
public Queue getQueue(String queueName) throws NamingException
{
return (Queue) getObjectByName(queueName);
}
}
Tester类
Tester类向OUT.QUEUE中写入消息,从IN.QUEUE中读取消息。参考清单2.
清单2 Tester.java
package devx.articles.mqjms;
//JMS 类
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.QueueSender;
import javax.jms.QueueReceiver;
import javax.jms.TextMessage;
import javax.jms.Message;
//JNDI 类
import javax.naming.NamingException;
//标准 Java 类
/**
*
* A class to test JMS with IBM MQ
*
*/
public class Tester
{
public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory";
public static String url = "file:/C:/JNDI-Directory";
public static void main(String[] vars) throws JMSException, NamingException
{
QueueSession session = null;
QueueConnection connection = null;
QueueConnectionFactory factory = null;
QueueSender queueSender = null;
QueueReceiver queueReceiver= null;
Queue oQueue = null; // 消息发送到的队列
Queue iQueue = null; // 接收消息的队列
try
{
JNDIUtil jndiUtil= new JNDIUtil(icf,url);
factory= jndiUtil.getQueueConnectionFactory("TestQM_QCF");
connection = factory.createQueueConnection();
// 启动(或重新启动)入站消息的连接地址,如果没有这个调用消息不会被接收
connection.start();
//表示一个非相互操作会话
boolean transacted = false;
session = connection.createQueueSession( transacted, Session.AUTO_ACKNOWLEDGE);
oQueue= jndiUtil.getQueue("OutputTestQueue");
queueSender = session.createSender(oQueue);
TextMessage oMsg = session.createTextMessage();
oMsg.setText("www.devx.com");
// 你还可以设置其他消息属性
queueSender.send(oMsg);
iQueue= jndiUtil.getQueue("InputTestQueue");
queueReceiver = session.createReceiver(iQueue);
Message iMsg = queueReceiver.receive(1000);
if ( iMsg != null )
System.out.println( ((TextMessage)iMsg).getText() );
else
System.out.println( "No messages in queue " );
}
finally
{
//总是释放资源
if ( queueReceiver!= null )
queueReceiver.close();
if ( queueSender!= null )
queueSender.close();
if ( session!= null )
session.close();
if ( connection!= null )
{
connection.close();
}
}
}
}
//JMS 类
import javax.jms.Queue;
import javax.jms.QueueSession;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Session;
import javax.jms.QueueSender;
import javax.jms.QueueReceiver;
import javax.jms.TextMessage;
import javax.jms.Message;
//JNDI 类
import javax.naming.NamingException;
//标准 Java 类
/**
*
* A class to test JMS with IBM MQ
*
*/
public class Tester
{
public static String icf = "com.sun.jndi.fscontext.RefFSContextFactory";
public static String url = "file:/C:/JNDI-Directory";
public static void main(String[] vars) throws JMSException, NamingException
{
QueueSession session = null;
QueueConnection connection = null;
QueueConnectionFactory factory = null;
QueueSender queueSender = null;
QueueReceiver queueReceiver= null;
Queue oQueue = null; // 消息发送到的队列
Queue iQueue = null; // 接收消息的队列
try
{
JNDIUtil jndiUtil= new JNDIUtil(icf,url);
factory= jndiUtil.getQueueConnectionFactory("TestQM_QCF");
connection = factory.createQueueConnection();
// 启动(或重新启动)入站消息的连接地址,如果没有这个调用消息不会被接收
connection.start();
//表示一个非相互操作会话
boolean transacted = false;
session = connection.createQueueSession( transacted, Session.AUTO_ACKNOWLEDGE);
oQueue= jndiUtil.getQueue("OutputTestQueue");
queueSender = session.createSender(oQueue);
TextMessage oMsg = session.createTextMessage();
oMsg.setText("www.devx.com");
// 你还可以设置其他消息属性
queueSender.send(oMsg);
iQueue= jndiUtil.getQueue("InputTestQueue");
queueReceiver = session.createReceiver(iQueue);
Message iMsg = queueReceiver.receive(1000);
if ( iMsg != null )
System.out.println( ((TextMessage)iMsg).getText() );
else
System.out.println( "No messages in queue " );
}
finally
{
//总是释放资源
if ( queueReceiver!= null )
queueReceiver.close();
if ( queueSender!= null )
queueSender.close();
if ( session!= null )
session.close();
if ( connection!= null )
{
connection.close();
}
}
}
}
开始点是连接工厂查找,这个工厂用于创建一个连接:
factory= jndiUtil.getQueueConnectionFactory("TestQM_QCF");
connection = factory.createQueueConnection();
connection = factory.createQueueConnection();
连接对象用于创建一个会话:
session = connection.createQueueSession( transacted, Session.AUTO_ACKNOWLEDGE);
要将消息写入IN.QUEUE queue,查找前面创建的目的地对象OutputTestQueue:
oQueue= jndiUtil.getQueue("OutputTestQueue");
最后创建一个QueueSender对象将消息写入队列:
queueSender = session.createSender(oQueue);
TextMessage oMsg = session.createTextMessage();
oMsg.setText("www.devx.com");
queueSender.send(oMsg);
TextMessage oMsg = session.createTextMessage();
oMsg.setText("www.devx.com");
queueSender.send(oMsg);
从OUT.QUEUE读取消息的过程相同,但使用的是QueueReceiver。