com.ibm.mq.MQQueue 对比 com.ibm.mq.jms.MQQueue?

com.ibm.mq.MQQueue vs. com.ibm.mq.jms.MQQueue?

我正在尝试将原始 MQSTR 消息放入 WebSphere MQ 队列。根据this,我可以做到:

((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 队列。

嗯。我不想给出 "RTM" 的答案,但这确实是答案。有 2 个 JAVA MQ API:1 个用于 "MQ classes for Java",1 个用于 "MQ classes for JMS"。

注意:"MQ classes for JMS" 会将 JMS header(又名 MQRFH2)放在消息中,而 "MQ classes for Java" 不会。

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

正在使用

((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 解释了要使用的常量。