如何将 Java JMS 与 MQseries 一起使用

2022-09-01 10:17:51

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

以下是建立 jms 连接所需的信息:

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

你知道怎么做吗 或者你有什么链接教我这样做吗?


答案 1

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

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

有一篇文章准确地描述了您要做什么,称为在 WebSphere MQ V6.0 上运行独立的 Java 应用程序 它只使用 JMS API,它在本地文件系统(.bindings 文件)中使用 JNDI。通过将 IBM JMS 类换成其他供应商并使用其 JNDI 工具,您将能够插入任何 JMS 传输,而无需使用此方法更改代码。

如果要在没有 JNDI 的情况下执行相同的操作,请查看随 MQ 客户机安装提供的样本程序,从中获取 Java 类。在UNIX / Linux系统中,它们位于Windows中,而在Windows上,它们位于.该样本包含以下代码,用于在不使用 JNDI 的情况下初始化连接工厂:/opt/mqm/sampinstall_dir/tools/jms/samplesSimpleRequestor.java

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 信息中心
V7 信息中心

最后,带有所有支持Pacs索引的登录页面在这里


答案 2

一个完整(同步)独立的JMS应用程序,带有TextMessage。
它是 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();
        }
    }
}

注: 替换配置值


推荐