本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/guozhanxian/archive/2007/01/21/1489309.aspx
配置JNDI
import java.util.Hashtable; |
理解示例类 如果你编写过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); 从OUT.QUEUE读取消息的过程相同,但使用的是QueueReceiver。 当你安装WMQ时会自动将编译和运行示例类需要的jar文件添加到CLASSPATH环境变量中,需要的jar文件位于C:\Program Files\IBM\WebSphere MQ\Java\lib,包括JMS和JNDI需要的jar。 在运行Tester类之前,使用MQ管理器向IN.QUEUE增加一条测试消息: 1.在 IN.QUEUE上点击右键,选择放入测试消息。 2.输入任意文本,点击放入消息。 如果你还没有在IN.QUEUE队列中放入过消息,Tester类会显示“队列中无消息”。 要运行Tester类,将Tester.class 和 JNDIUtil.class添加到CLASSPATH,然后在命令提示符输入: java devx.articles.mqjms.Tester 应用程序向OUT.QUEUE写入一条消息,并显示从IN.QUEUE检索到的消息,要检查发送到OUT.QUEUE中的消息,进入MQ管理器,在OUT.QUEUE上点击右键?选择“浏览消息”即可。 企业中的Java和WMQ MOM 在大型企业环境下,可以充分利用WMQ的性能和稳定性优势,只要你的代码遵循Java标准接口,你就可以受益。 本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2009/0419/3122_2.php |
这个是自己写的
所使用jar包为:ibmmq.jar,com.ibm.mq.jar,jms.jar,com.ibm.mq_jms.jar
package com.learn.mq; import com.ibm.mq.jms.*; } //消息监听器 //异常监听器,需要有消息监听器一同运行,它将会发送MyExceptionListener对象到onMessage中 //此处可放入更多逻辑 |