我有MQConsumerClass,它从队列中检索消息,如下所示。
while (running)
{
try
{
MQMessage rcvMessage = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_WAIT;
gmo.waitInterval = 60000;
queue.get(rcvMessage, gmo);
if(rcvMessage.getTotalMessageLength() > 0)
{
String msgText = rcvMessage.readUTF();
}
}
catch blocks{}
}
但问题是当队列中没有消息时,会抛出2033异常。
我认为2033 NO_MSG_AVAILABLE异常不是严重的异常,可能会停止操作。
但是,只要队列中有新消息,我就想调用onMessage(Message msg)
函数。
我想用MessageListener创建这个类,但我找不到MessageListener或与之相关的任何示例。
所以,请告诉我WMQ Java API中是否有任何MessageListener函数。
或
任何方式做到这一点?
答案 0 :(得分:5)
2033'错误'实际上不是错误,它更像是MQSeries返回状态:MQRC_NO_MSG_AVAILABLE 2033 MQTester程序正在轮询队列以查找消息,但没有消息可用。
您可以使用
将其排除MQException.logExclude(新 整数(MQException.MQRC_NO_MSG_AVAILABLE));
答案 1 :(得分:1)
嗯,WMQ Java API没有消息监听器。类似于onMessage
的JMS不存在,只有同步接收。
答案 2 :(得分:1)
在这种循环中,你无法完全避免这些2033“无消息”异常。通过增加等待间隔,几乎没有缺点(除非你完成后应用程序关闭可能会更慢),你将减少每次获取调用失败的机会。因此,例如,如果您指定5分钟的等待间隔,只要每5分钟至少有一条消息到达队列,那么每个get调用都将收到一条消息(通常)。但是你仍然需要一个catch块来处理这种异常,因为你有时会在等待间隔内找不到消息。只要你的等待间隔不是太短,那个失败的get,catch block和respin在循环周围的性能开销应该相对较小。
如果您确实想要使用异步使用者,当消息可用时将调用您的应用程序,那么JMS的WebSphere MQ类就是Java API,您可以在其中找到MessageListener接口。 WebSphere MQ为Java公开了2个不同的API。您的代码片段使用的是WebSphere MQ classes for Java,而不是JMS。
答案 3 :(得分:1)
您可以使用 MQConstants.MQWI_UNLIMITED 指定超长等待间隔。
while (running) {
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_WAIT;
gmo.waitInterval = MQConstants.MQWI_UNLIMITED;
try {
// Get the message off the queue.
queue.get(rcvMessage, gmo);
} catch (MQException e) {
if (e.reasonCode == 2033) {
continue;
}
}
}