如何将Java JMS与MQseries一起使用

Dav*_*vid 31 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
Run Code Online (Sandbox Code Playgroud)

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

T.R*_*Rob 48

这里的问题是要求"我的老板让我使用纯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的情况下执行相同的操作,请查看随获取Java类的MQ客户机安装提供的示例程序.在UNIX/Linux系统中,这些系统/opt/mqm/samp位于Windows所在的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");
Run Code Online (Sandbox Code Playgroud)

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

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

V6 Infocenter
V7信息中心

最后,带有所有SupportPac索引的登录页面就在这里.

  • 这是一个有趣的语义舞蹈.传输提供程序的JMS类*在CLASSPATH中以某种方式存在.在您的示例中,JEE服务器提供了一个容器,在该容器中访问IBM MQ JMS库.但无论哪种方式,应用程序仍然使用这些特定的类*并可以访问其特定于供应商的方法*.它并不像JEE服务器以某种方式隐藏了应用程序中的供应商实现,因此它似乎对我来说毫无意义的区别.另外,OP指定了一个独立的JMS应用程序,所以大概在他的场景中没有JEE容器. (2认同)

Pre*_*raj 11

具有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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:替换配置值


str*_*mqm 9

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

MQConnectionFactory cf = new MQConnectionFactory();
cf.setHostName(HOSTNAME);
cf.setPort(PORT);
cf.setChannel(CHANNEL);
cf.setQueueManager(QMNAME);
cf.setTransportType(WMQConstants.WMQ_CM_CLIENT);
Run Code Online (Sandbox Code Playgroud)

然后是通常的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);
Run Code Online (Sandbox Code Playgroud)

最后创建并发送一条消息

Message m = s.createTextMessage("Hello, World!);
p.send(m);
Run Code Online (Sandbox Code Playgroud)

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

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