我编写了一个MQ应用程序,它是exe,但它只针对单个实例运行并终止自身。所需的功能是使其连续运行并继续处理数据,一旦数据耗尽,它应该继续监听新数据。
请问有人可以告诉我需要做什么?
谢谢!
答案 0 :(得分:5)
目前,您的应用程序可能会循环显示消息,直到它返回返回代码,指示队列为空。为了继续收听新数据,您需要做两件事:
Receive()
。您必须将此与下一个建议相结合。Receive()
时。例如,consumer.Receive(20000)
将在超时之前等待20秒以显示下一条消息。如果你没有包含超时,那么应用程序将在QMgr上抛出大量未满足的GET请求,这些请求似乎是一个失控的应用程序和/或失控的QMgr,你会看到具有高CPU利用率的进程。 / p>
您可以在Receive()
次来电之间休眠,但效果不是很好。使用Receive(TIMEOUT)
仅在没有消息可用时阻止线程。一旦消息到达,将消息传递给线程就没有延迟。如果您手动休眠线程,它必须轮询队列,并且只会以sleep()
间隔设置。
另一种方法是您可以设置回调方法,以便线程不会阻塞。例如,如果您有回调方法OnNewMessageCallback
,则可以使用MessageListener messageListener = new MessageListener(OnNewMessageCallback);
样本中描述了这两种方法。如果您安装了SDK和示例,这些将在C:\Program Files (x86)\IBM\WebSphere MQ\tools\dotnet\samples
或等效项下,具体取决于您安装WMQ的位置。
如果您想知道如何区分“队列中没有消息”和更严重的错误之间的区别,请检查MQException.ReasonCode
。如果是2033,则Receive()
超时。那个和所有其他原因代码都定义为here。
一旦你有一个成功循环并等待新消息的程序,你可以选择将其作为服务运行,如Simon的响应中所述,或者像现在一样以交互方式运行。
如果您正在使用WMQ v6进行开发,请注意v6是截至2012年9月的服务终止,并且.Net集成在
答案 1 :(得分:1)
我建议您将代码转换为Windows服务。请参阅此处获取.NET启动程序:Introduction to Windows Service Applications
答案 2 :(得分:1)
如果您使用的是.NET接口,那么请查看IBM消息服务客户端以获取.NET a.k.a XMS .NET。 XMS .NET提供类似JMS的API,但是使用.NET语言。它有一个消息监听器,通过它可以异步接收消息。
XMS作为MQ v7 Client SupportPac MQC7的一部分安装。