如何将Java JMS与MQseries一起使用

时间:2011-08-04 02:47:36

标签: java jms ibm-mq

我正在尝试开发一个JMS 独立应用程序来读取和写入MQSeries上的Queue。 我的老板让我使用纯java JMS (不是ibm.mq lib)来做到这一点。

以下是进行jms连接所需的信息:

  mq.hostname=10.10.10.10
  mq.channel=API.CLIENTCHL
  mq.queueManager=MQPETAPI
  mq.port=1422

你知道怎么做吗?或者你有任何教导我这样做的链接。

6 个答案:

答案 0 :(得分:48)

这里的问题是要求“我的老板让我使用纯Java JMS(不是ibm.mq lib)来做到这一点。” JMS是一个规范,每个实现必须符合API和语义,但可以自由地在低级别做任何他们想做的事情。始终需要使用传输供应商提供的实现类。因此,如果使用WebSphere MQ作为传输,则需要使用IBM MQ JMS类来编写JMS应用程序。

也就是说,如果你坚持使用纯JMS API调用,你就可以插入任何传输供应商的类。当您获得原始帖子中提到的要求时,这通常是预期的。

有一篇文章准确描述了您要做的事情,名为 Running a standalone Java application on WebSphere MQ V6.0 它仅使用JMS API,并在本地文件系统(.bindings文件)中使用JNDI。通过为其他供应商换出IBM JMS类并使用他们的JNDI工具,您可以使用这种方法插入任何JMS传输而无需更改代码。

如果您想在没有JNDI的情况下执行相同的操作,请查看随获取Java类的MQ客户端安装提供的示例程序。在UNIX / Linux系统中,它们位于/opt/mqm/samp中,而在Windows上,它们位于install_dir/tools/jms/samples中。 SimpleRequestor.java示例具有以下用于在没有JNDI的情况下初始化连接工厂的代码:

try {
  // Create a connection factory
  JmsFactoryFactory ff = JmsFactoryFactory.getInstance(WMQConstants.WMQ_PROVIDER);
  JmsConnectionFactory cf = ff.createConnectionFactory();

  // Set the properties
  cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "localhost");
  cf.setIntProperty(WMQConstants.WMQ_PORT, 1414);
  cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "SYSTEM.DEF.SVRCONN");
  cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
  cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "QM1");

由于此方法不使用JNDI,因此您需要编写不能跨传输供应商传输的代码。它是IBM WebSphere MQ特定的。

如果您从某处抓取MQ jar并且没有完整安装(因此没有样本),您可以将其下载为SupportPac MQC7。下载是免费的。通常,您应该使用最新的客户端,即使使用后端级别的队列管理器也是如此。显然,您没有从V6 QMgr获得V7功能,但V7客户端中的JMS实现得到了很大改进,即使对于V6功能也是如此。如果由于某种原因您确实必须使用V6客户端,则可以将其下载为SupportPacMQC6。无论您使用哪种客户端版本,请务必使用相应的信息中心。

V6 Infocenter
V7 Infocenter

最后,包含所有SupportPac索引的着陆页为here

答案 1 :(得分:10)

  

使用TextMessage的完整(同步)独立JMS应用程序。
  它是IBM WebSphere MQ特定的。

import javax.jms.DeliveryMode;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueReceiver;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;

import com.ibm.mq.jms.JMSC;
import com.ibm.mq.jms.MQQueueConnectionFactory;

public class JMSApplicationStandAlone {
    public static void main(String[] args) {
        try {
            /*MQ Configuration*/
            MQQueueConnectionFactory mqQueueConnectionFactory = new MQQueueConnectionFactory();
            mqQueueConnectionFactory.setHostName("localhost");
            mqQueueConnectionFactory.setChannel("MQ.CHANNEL");//communications link
            mqQueueConnectionFactory.setPort(1416);
            mqQueueConnectionFactory.setQueueManager("QUEUE.MGR");//service provider 
            mqQueueConnectionFactory.setTransportType(JMSC.MQJMS_TP_CLIENT_MQ_TCPIP);

            /*Create Connection */
            QueueConnection queueConnection = mqQueueConnectionFactory.createQueueConnection();
            queueConnection.start();

            /*Create session */
            QueueSession queueSession = queueConnection.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);

            /*Create response queue */
            Queue queue = queueSession.createQueue("QUEUE.RESPONSE");


            /*Create text message */
            TextMessage textMessage = queueSession.createTextMessage("put some message here");
            textMessage.setJMSReplyTo(queue);
            textMessage.setJMSType("mcd://xmlns");//message type
            textMessage.setJMSExpiration(2*1000);//message expiration
            textMessage.setJMSDeliveryMode(DeliveryMode.PERSISTENT); //message delivery mode either persistent or non-persistemnt

            /*Create sender queue */
            QueueSender queueSender = queueSession.createSender(queueSession.createQueue("QUEUE.REQEST"));
            queueSender.setTimeToLive(2*1000);
            queueSender.send(textMessage);

            /*After sending a message we get message id */
            System.out.println("after sending a message we get message id "+ textMessage.getJMSMessageID());
            String jmsCorrelationID = " JMSCorrelationID = '" + textMessage.getJMSMessageID() + "'";


            /*Within the session we have to create queue reciver */
            QueueReceiver queueReceiver = queueSession.createReceiver(queue,jmsCorrelationID);


            /*Receive the message from*/
            Message message = queueReceiver.receive(60*1000);
            String responseMsg = ((TextMessage) message).getText();

            queueSender.close();
            queueReceiver.close();
            queueSession.close();
            queueConnection.close();


        } catch (JMSException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意:替换配置值

答案 2 :(得分:9)

如果您不介意编写特定于WMQ的代码,那么您可以

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);

然后是通常的JMS资源

Connection c = cf.createConnection();
Session s = c.createSession(false, Session.AUTO_ACKNOWLEDGE);
Queue q = s.createQueue("myQueue"); // replace with real queue name
MessageProducer p = s.createProducer(q);

最后创建并发送消息

Message m = s.createTextMessage("Hello, World!);
p.send(m);

(我把它排在了我的头顶,所以不能排除一个错字,但它从根本上说是正确的)。如果你真的应该使用'纯JMS' - 即没有特定于提供者的对象 - 那么你需要在JNDI中绑定一个MQConnectionFactory对象(看一下JMSAdmin工具,它在文档中)然后查找它来自您的申请,即

InitialContext ic = new InitialContext(); // or as appropraite
ConnectionFactory cf = (ConnectionFactory)ic.lookup("myMQfactory"); // replace with JNDI name

答案 3 :(得分:3)

通常使用JMS,您可以通过它提供的任何配置机制在容器中定义QueueConnectionFactory,然后将其添加到容器的JNDI注册表中。每个容器都有自己的方法(即Tomcat与WebSphere)。

如果要放弃JNDI,可以直接创建com.ibm.mq.jms.MQQueueConnectionFactory的实例,并在其上设置主机名,端口,队列管理器和通道属性。然后,您可以像使用javax.jms.QueueConnectionFactory实例一样使用该对象,因为它实现了它。

答案 4 :(得分:2)

我不能在一篇文章中教你JMS,但我可以指出一些我自己用来学习它的资源:

  1. O'Reilly Java Message Service
  2. IBM Developerworks JMS Tutorial(更多MQSeries / Websphere MQ特定)
  3. Spring框架可以帮助您更有效地使用JMS,尤其是当您在J2EE应用服务器之外开发独立应用时:Spring Java Message Service documentation

答案 5 :(得分:0)

这很常见。 Here是一些例子。