.net - 如何使 MQ 应用程序 exe 连续运行?

标签 .net windows-services ibm-mq

我写了一个 MQ 应用程序,它是 exe,但它只运行一个实例并自行终止。所需的功能是让它持续运行并继续处理数据,一旦数据耗尽,它应该继续监听新数据。

有人可以建议我需要做什么吗?

谢谢!

最佳答案

目前,您的应用程序可能会循环处理消息,直到它返回一个指示队列为空的返回代码。为了持续监听新数据,您需要做两件事:

  1. 当您返回“空队列”的返回码时不要退出循环。循环并尝试另一个 Receive()。不过,您必须将此与下一条建议结合起来。
  2. 当您执行 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/

相关文章:

.net - 处置SolidBrush和Pen是否重要?

c# - DateTime 没有按照系统格式出现 C# Windows 服务

java - 如何按条件从队列中删除消息?

c# - 检查控制计时器的线程的状态

C#,在 teamcity 构建后部署 Windows 任务和服务

java - 如何使用数据库配置通过 IBM Websphere MQueue 设置 JBoss 6.4 EAP

spring-boot - Spring Boot 连接到 IBM MQ Cloud

.net - AWS 中的 SQL Server CLR 存储过程

c# - MVC 3 模型验证问题——疏忽或设计使然

c# - .NET 的 HttpWebResponse 是否自动解压缩 GZiped 和 Deflated 响应?