如何让MQ app exe连续运行?

时间:2011-11-21 20:05:44

标签: .net windows-services ibm-mq

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

请问有人可以告诉我需要做什么?

谢谢!

3 个答案:

答案 0 :(得分:5)

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

  1. 当您返回“空队列”的返回码时,不要退出循环。循环并尝试另一个Receive()。您必须将此与下一个建议相结合。
  2. 当您使用超时执行Receive()时。例如,consumer.Receive(20000)将在超时之前等待20秒以显示下一条消息。
  3. 如果你没有包含超时,那么应用程序将在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集成在 0或v7.1中的很多更好WMQ。您可以从SupportPac MQC7下载带有.Net类的最新WMQ v7.0客户端。相应的信息中心为here。 v7.1客户端在发布时将是SupportPac,但确切名称尚不清楚。我会尽量记住在链接可用时更新它。截至今天,v7.1客户端可通过Passport Advantage使用您的IBM客户帐户获得。 v7.1信息中心为here

答案 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的一部分安装。