我写了一个 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 集成在 v7.0 或 v7.1 中好多了 WMQ。您可以从 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/