簡體   English   中英

MQ C API-如何在多線程環境中中止正在等待的`MQGET`

[英]MQ C API - how to abort a waiting `MQGET` in a multithreaded environment

我在多線程應用程序中使用MQ C API,其中多個工作線程正在通過在循環中調用MQGET (設置了MQGMO_WAIT且等待間隔為MQWI_UNLIMITED )來處理各自隊列中的傳入消息。

它可以工作,但是我找不到關閉工作線程的干凈方法。 如果我在另一個線程中調用MQDISCMQCLOSE ,則只要有未完成的MQGET調用,它就會阻塞。

現在,我最好的解決方案是使用5000的有限等待間隔,而不是MQWI_UNLIMITED ,這樣, MQGET調用每5秒返回一次,從而使應用程序有機會關閉。 但是此解決方案效率較低(工作線程每5秒喚醒一次),並且該應用最多需要5秒才能關閉。

使用本機OS API終止線程聽起來不是一個好的解決方案。

所以問題是-當等待間隔為MQWI_UNLIMITED時,是否有任何方法可以干凈地中止等待的MQGET

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

使用MQCallBack調用而不是MQGET。

一種選擇是,如果您禁用從隊列中獲取(即ALTER QLOCAL(xxx)GET(DISABLED)),則任何等待中的吸氣劑都會由於MQRC_GET_INHIBITED的原因而立即拋出。

已經給出的兩個答案是不錯的選擇,我要添加第三個答案,所以這里是完整列表。

  • 您使用的是V7,因此可以使用回調機制MQCB和回調函數,然后可以使用MQCTL掛起或停止連接。
  • 使用管理命令,或在另一個線程上使用MQSET調用,將隊列更改為GET(DISABLED),這將使用MQRC_GET_INHIBITED喚醒MQGET等待。
  • 從另一個線程MQPUT(1)向MQGET等待的隊列發送消息。 確保您獲取的代碼了解此消息的格式/內容表示“該應用程序終止的時間”。

所有這些都同樣有效,但是需要對當前應用程序進行不同程度的更改,只有您才能知道哪種代碼最簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM