Java 使用WMQ代码(而不是JMS)实现IBM MQ侦听器

Java 使用WMQ代码(而不是JMS)实现IBM MQ侦听器,java,ibm-mq,Java,Ibm Mq,我很难用WMQJARS/代码实现IBMMQ侦听器(在消息事件上)。 我见过JMS实现,其中我们有OnMessage方法,每当队列中收到消息时就会执行该方法。我正在寻找使用WMQ JAR的类似选项。我正在学习MQGetMessageOptions类和MQC选项,但到目前为止运气不好。任何帮助都将不胜感激 我正在使用com.ibm.mq-6.0.2.1.jarjar文件。摘要: IBM MQ JMS类使用自IBM MQ v7.0以来的底层IBM MQ回调功能实现异步消息侦听器功能(onMessage

我很难用WMQJARS/代码实现IBMMQ侦听器(在消息事件上)。 我见过JMS实现,其中我们有OnMessage方法,每当队列中收到消息时就会执行该方法。我正在寻找使用WMQ JAR的类似选项。我正在学习MQGetMessageOptions类和MQC选项,但到目前为止运气不好。任何帮助都将不胜感激


我正在使用com.ibm.mq-6.0.2.1.jarjar文件。

摘要

IBM MQ JMS类使用自IBM MQ v7.0以来的底层IBM MQ回调功能实现异步消息侦听器功能(onMessage)

IBM MQ Java类根本不支持异步消息侦听器功能(回调)


背景

回调功能在v7.0添加到IBM MQ,但IBM没有在IBM MQ Java类中实现此功能

请注意,根据v9.0知识中心页面“”,IBM MQ Java类在功能上已稳定在IBM MQ 8.0版中提供的级别。由于IBM MQ classes for Java在IBM MQ v8.0中没有此功能,因此IBM不会添加此功能,除非它们改变方向

IBM稳定某个特性后的下一步是弃用该特性。不建议使用IBM MQ Java类开发新的应用程序,最好使用IBM MQ JMS类


备选方案

如果确实需要使用IBM MQ classes for Java,则需要轮询队列以查找消息,而不是注册对MQ的回调。请注意,由于在MQ v7.0之前不存在回调,所以MQ v6.0及更低版本的IBM MQ JMS异步消息侦听器类是通过在后台轮询队列来实现的。IBM一直支持等待获取。执行一个简单的循环,在等待时间为X的情况下执行get,只需在等待超时或新消息到达队列时联系队列管理器

如果您在不等待的情况下执行一个GET,然后立即在不等待的情况下执行另一个GET,那么这既昂贵又不是推荐的解决方案

IBM MQ classes for JMS异步消息侦听器的优点在于IBM已经完成了艰苦的工作,您只需要编写代码来处理消息,而不需要编写获取消息的逻辑。在我看来,使用IBM MQ classes for JMS异步消息侦听器仍然是一种比正确编写的轮询应用程序更好的方法,因为如果没有其他方法,您就不会重新发明轮子


其他API

当然还有其他支持回调的非Java API

  • 在C#中,它有一个类似的情况,原始的MQ.NET API(
    amqmdnet.dll
    )不支持回调,但较新的XMS.NET API(类似JMS的.NET实现)支持回调
  • 正常的C API支持回调,但C++没有。如果使用C API库的任何东西公开了回调功能,那么它们在技术上都可以支持回调,但有些东西不支持,例如pymqi基于C API库,但不支持回调

首先:IBM MQ 6.0自2012年9月30日(超过7年)起就失去了IBM的支持。为什么不使用更新的受支持版本。例如,TLS 1.2在该级别不受支持,双向热拍也不受支持。该级别还需要多个jar文件。如果您使用JMS API,最新支持的版本只需要一个IBM MQ jar(
com.IBM.MQ.allclient.jar
)以及1到3个其他Oracle jar。IBM MQ服务器运行在8.0上,将在4月之前迁移到9.0。我提到的jar就是客户机jar,我提到的都是与客户机jar相关的。你的另一个问题是它是否有效。正如Morag的回答中所述,它将只支持该级别的现有功能。v6.0和v9.1之间在功能和安全性方面都有很多改进。如果你正在开发一个新的应用程序,那么使用旧版本(6.0)是不可想象的。谢谢@JoshMc。了解IBM MQ Java类没有侦听队列的功能。(直到8.0),推荐的方法是将IBMMQ类用于JMS。谢谢你的澄清。因此,结论是不可能用WMQ代码实现此功能?IBM MQ classes for Java即使在v8.0或更高版本上也不支持此功能,而且永远不会支持此功能,除非IBM对上述内容有所改变。