在沙盒环境中,我正在测试IBM MQ。我已经有了RabbitMq的经验。
使用IBM MQ,我无法直接使用队列中的消息。 RabbitMQ就是这种情况(Consume()方法)。但是使用IBM MQ,我必须使用以下代码显式查看队列:
var queue = _queueManager.AccessQueue("queueName", MQC.MQOO_INPUT_AS_Q_DEF + MQC.MQOO_FAIL_IF_QUIESCING);
这就是我现在对从队列中读取消息的了解。但有没有人可以帮助我,如果有一种方法可以直接使用消息(事件明智,或者换句话说:实时消费。队列中的项目将是开始阅读它的触发器。)而无需调用上述代码?
答案 0 :(得分:2)
您可以查看使用XMS .NET客户端的消息侦听器,以便在消息到达队列时使用消息。您需要在项目中引用IBM.XMS程序集。您可以查看异步使用者样本Tools\dotnet\samples\cs\xms\simple\wmq\SimpleAsyncConsumer\SimpleAsyncConsumer.cs.
答案 1 :(得分:1)
如果要通过消息到达队列来触发,可以配置PROCESS并根据队列的触发消息将该进程设置为运行。
或者,您可以查看MQGMO_WAIT,并且可以使用几乎上面的确切代码在侦听队列中的消息时保持线程阻塞。
编辑:因此,只要消息到达触发器队列(每个),或者消息第一次到达触发器队列(第一次),您就可以将代码设置为调用,并且您的MQ进程将类似于" /path/to/myprog.exe" ;.传入的参数将采用MQTriggerMessage的格式,并包括队列名称和一些其他详细信息。假设您在每条消息上设置触发器,这将允许任意数量的处理任务。
或者,您可以将队列作为共享打开,并且多个任务可以等待消息到达队列。使用MQOpenOption.INPUT_SHARED标志。
答案 2 :(得分:1)
但是对于IBM MQ,我必须使用以下内容明确查看队列 代码:
var queue = _queueManager.AccessQueue(“queueName”,...
您需要多做一些阅读,因为AccessQueue只会打开队列。您需要使用Queue的Get方法来检索消息。
如果你想永远这样做(直到队列管理器关闭),那么你可以这样做:
private void loopForever(MQQueue inQ)
{
bool flag = true;
MQMessage msg = new MQMessage();
MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.Options |= MQC.MQGMO_WAIT | MQC.MQGMO_FAIL_IF_QUIESCING;
gmo.WaitInterval = MQC.MQEI_UNLIMITED;
while (flag)
{
try
{
msg = new MQMessage();
inQ.Get(msg, gmo);
System.Console.Out.WriteLine("Message Data: " + msg.ReadString(msg.MessageLength));
}
catch (MQException mqex)
{
System.Console.Out.WriteLine("MQTest61B CC=" + mqex.CompletionCode + " : RC=" + mqex.ReasonCode);
flag = false; // severe error - time to exit
}
catch (System.IO.IOException ioex)
{
System.Console.Out.WriteLine("MQTest61B ioex=" + ioex);
}
}
}