我已经编写了一个MQ应用程序,它是exe,但它仅在单个实例上运行并自行终止。所需的功能是使其连续运行并继续处理数据,并且一旦数据用完,它应继续侦听新数据。
有人可以建议我需要做什么吗?
谢谢!
最佳答案
当前,您的应用程序可能会遍历消息,直到它返回一个指示队列为空的返回码。为了继续侦听新数据,您需要做两件事:
Receive()
。不过,您必须将此与下一个推荐结合起来。 Receive()
时,请使用超时。例如,consumer.Receive(20000)
将等待20秒等待下一条消息,然后再超时。 如果不包括超时,则应用程序将在QMgr上抛出大量未满足的GET请求,这看起来像是一个失控的应用程序和/或失控的QMgr,您将看到CPU使用率高的进程。
您可以在
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集成在WMQ的v7.0或v7.1中要好得多。您可以从SupportPac MQC7下载具有.Net类的最新WMQ v7.0客户端。相应的信息中心为here。 v7.1客户端在发布时将是SupportPac,但是确切名称尚不清楚。我会尽量记住用链接更新此链接。从今天起,可以使用您的IBM客户帐户通过Passport Advantage使用v7.1客户端。 v7.1信息中心是here。
关于.net - 如何使MQ应用exe连续运行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8217836/