MQ C API - 如何在多线程环境中中止等待的`MQGET`

时间:2016-05-02 19:42:37

标签: c ibm-mq

我在多线程应用程序中使用MQ C API,其中多个工作线程通过在循环中调用MQGET来处理每个来自其自己队列的传入消息(设置MQGMO_WAIT并等待间隔为MQWI_UNLIMITED)。

它可以工作,但我找不到一个干净的方法来关闭工作线程。如果我在另一个帖子中拨打MQDISCMQCLOSE,只要有未完成的MQGET电话,它就会屏蔽。

现在,我最好的解决方案是使用5000而不是MQWI_UNLIMITED的有限等待间隔,这样MQGET调用每5秒返回一次,让应用程序有机会关闭。但是这种解决方案效率较低(工作线程每5秒唤醒一次),并且应用程序最多需要5秒才能关闭。

使用本机OS API终止线程听起来不是一个好的解决方案。

所以问题是 - 当等待间隔为MQGET时,有没有办法干净地中止等待MQWI_UNLIMITED

操作系统是Windows Server 2012 x64,MQ服务器版本是7.0.0.19。

3 个答案:

答案 0 :(得分:2)

使用MQCallBack调用而不是MQGET。

答案 1 :(得分:1)

一个选项是如果禁用从队列中获取(即ALTER QLOCAL(xxx)GET(DISABLED)),任何等待的getter将立即被抛出,原因是MQRC_GET_INHIBITED。

答案 2 :(得分:1)

已经给出的两个答案都是不错的选择,我还有第三个要添加,所以这里是完整列表。

  • 您在V7上作为mimumum,因此您可以使用回调机制,MQCB和回调函数,然后您可以使用MQCTL暂停或停止连接。
  • 使用admin命令,或者在另一个线程上使用MQSET调用,将队列更改为GET(DISABLED),这将唤醒MQGET-wait with MQRC_GET_INHIBITED。
  • 从另一个线程MQPUT(1)向MQGET正在等待的队列发送消息。确保您的获取代码了解此消息的格式/内容意味着“结束应用程序的时间”。

所有这些都同样有效,但需要对您当前的应用程序进行不同程度的更改,只有您可以知道代码中哪个更容易。