我必须定期检查Websphere MQ中队列中的消息。我没有找到更好的方法,而不是尝试获取消息并处理2033原因代码(这是NO_MSG_AVAILABLE),如下所示:
try
{
// ...
inQueue.Get(message);
}
catch (MQException exception)
{
if (exception.ReasonCode != 2033)
throw;
}
有更好的方法从队列中获取消息吗?我认为可能有一些我不知道的openOptions标志,在没有可用消息时不会抛出异常,而是返回null。
答案 0 :(得分:6)
有三种方法可以避免或减少这种轮询机制。 在这里他们优雅(越高越好):
答案 1 :(得分:4)
您错过了MQC.MQGMO_WAIT
上的MQGetMessageOptions.Options
标记。改变方式:
getOptions = new MQGetMessageOptions {WaitInterval = MQC.MQWI_UNLIMITED, Options = MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING}
请注意,这将使得调用线程被阻塞,直到消息到达队列或发生某些连接异常。 MQ有另一个名为IBM Message Service Client(又名XMS .NET)的客户端,它在.NET中提供JMS规范实现。这有一个很好的小Message Listener
,当消息到达队列时会自动调用它。与上面的示例不同,使用Message Listener时不会阻止调用线程。
可以找到有关XMS .NET的更多详细信息here。样本也附带MQ和消息监听器示例,请参阅“SampleAsyncConsumer.cs”源文件。
答案 2 :(得分:2)
我得到了这个。我通过将Message initiator放在循环中来解决它:
_queueManager = new MQQueueManager(Queuemanager, _mqProperties);
MQQueue queue = _queueManager.AccessQueue(
Queuename,
MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING + MQC.MQOO_INQUIRE);
string xml = "";
while (queue.CurrentDepth > 0)
{
MQMessage message = new MQMessage();
queue.Get(message);
xml = message.ReadString(message.MessageLength);
MsgQueue.Enqueue(xml);
message.ClearMessage();
}
在内部消息中必须有一些东西在重新使用它时会出现错误。