我在多线程应用程序中使用MQ C API,其中多个工作线程通过在循环中调用MQGET
来处理每个来自其自己队列的传入消息(设置MQGMO_WAIT
并等待间隔为MQWI_UNLIMITED
)。
它可以工作,但我找不到一个干净的方法来关闭工作线程。如果我在另一个帖子中拨打MQDISC
或MQCLOSE
,只要有未完成的MQGET
电话,它就会屏蔽。
现在,我最好的解决方案是使用5000
而不是MQWI_UNLIMITED
的有限等待间隔,这样MQGET
调用每5秒返回一次,让应用程序有机会关闭。但是这种解决方案效率较低(工作线程每5秒唤醒一次),并且应用程序最多需要5秒才能关闭。
使用本机OS API终止线程听起来不是一个好的解决方案。
所以问题是 - 当等待间隔为MQGET
时,有没有办法干净地中止等待MQWI_UNLIMITED
?
操作系统是Windows Server 2012 x64,MQ服务器版本是7.0.0.19。
答案 0 :(得分:2)
使用MQCallBack调用而不是MQGET。
答案 1 :(得分:1)
一个选项是如果禁用从队列中获取(即ALTER QLOCAL(xxx)GET(DISABLED)),任何等待的getter将立即被抛出,原因是MQRC_GET_INHIBITED。
答案 2 :(得分:1)
已经给出的两个答案都是不错的选择,我还有第三个要添加,所以这里是完整列表。
所有这些都同样有效,但需要对您当前的应用程序进行不同程度的更改,只有您可以知道代码中哪个更容易。