技术开发 频道

使用JMS接口接入WebSphere MQ消息

  理解示例类

  如果你编写过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);

  }

  }

    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();

  }

  }

  }

  }

   开始点是连接工厂查找,这个工厂用于创建一个连接:

factory= jndiUtil.getQueueConnectionFactory("TestQM_QCF");

  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);

  从OUT.QUEUE读取消息的过程相同,但使用的是QueueReceiver。

1
相关文章