com.ibm.mq.MQQueue与com.ibm.mq.jms.MQQueue?

时间:2015-01-19 21:35:19

标签: java ibm-mq

我正在尝试将原始MQSTR消息放在WebSphere MQ队列上。根据{{​​3}},我可以这样做:

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

表示它是非JMS队列。 (我知道JMSC.MQJMS_CLIENT_NONJMS_MQ已被弃用 - 这与此问题无关。)但是,我一直在使用com.ibm.mq.MQQueue而不是com.ibm.mq.jms.MQQueue。从前者到后者的铸造都行不通。此外,只有com.ibm.mq.jms.MQQueue具有setTargetClient方法。

为什么有两个MQQueue类,我应该使用哪一个?我想使用主机名,通道名和队列管理器名(而不是JNDI)在Java程序中外部连接到z / OS队列。

2 个答案:

答案 0 :(得分:2)

姆。我不想给出“RTM”答案,但这确实是答案。有两个JAVA MQ API:1个用于“MQ classes for Java”,1个用于“MQ类用于JMS”。

注意:“用于JMS的MQ类”将把JMS头(也称为MQRFH2)放在消息中,而“MQ classes for Java”则不会。

因此,如果您正在编写常规Java / MQ应用程序,那么不要使用“MQ类for JMS”,只需使用“MQ classes for Java”,您就可以了。

答案 1 :(得分:0)

使用

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

将告诉JMS客户端不会使用RFH2,因此发送JMSTextMessage将确保普通的MQSTR格式消息到达队列。即目标客户端不是JMS,因此不需要RFH2。

坚持使用带有上述设置的com.ibm.mq.jms.MQQueue的JMS API。弃用的原因是使用另一组常量。这个提供的函数不被弃用。

此技术说明http://www-01.ibm.com/support/docview.wss?uid=swg21423244解释了要使用的常量。