Dot-Net

如何瀏覽 Websphere MQ 消息而不刪除它?

  • February 7, 2022

我正在編寫一個 .NET Windows 窗體應用程序,它將向 Websphere MQ 隊列發布消息,然後輪詢另一個隊列以獲取響應。如果返迴響應,應用程序將實時處理部分響應。但是響應需要保留在隊列中,以便每日批處理作業(也從響應隊列中讀取)可以完成其餘的處理。

我已經閱讀了該消息。我無法弄清楚的是如何在不刪除它的情況下閱讀它。

這是我到目前為止所得到的。我是 MQ 新手,所以任何建議都將不勝感激。並隨時用 C# 回复。

Public Function GetMessage(ByVal msgID As String) As MQMessage
   Dim q = ConnectToResponseQueue()
   Dim msg As New MQMessage()
   Dim getOpts As New MQGetMessageOptions()
   Dim runThru = Now.AddMilliseconds(CInt(ConfigurationManager.AppSettings("responseTimeoutMS")))
   System.Threading.Thread.Sleep(1000) 'Wait for one second before checking for the first response'
   While True
       Try
           q.Get(msg, getOpts)
           Return msg
       Catch ex As MQException When ex.Reason = MQC.MQRC_NO_MSG_AVAILABLE
           If Now > runThru Then Throw ex
           System.Threading.Thread.Sleep(3000)
       Finally
           q.Close()
       End Try
   End While
   Return Nothing 'Should never reach here'
End Function

**注意:**我尚未驗證我的程式碼是否確實刪除了該消息。但這就是我理解 MQ 工作的方式,這似乎就是正在發生的事情。如果這不是預設行為,請糾正我。

您需要使用 MQOO_BROWSE 選項打開隊列。然後在您第一次閱讀時,您使用 MQGMO_BROWSE_FIRST 選項執行 GET。最後,您的後續 GET 應該使用 MQGMO_BROWSE_NEXT 選項。

注意:MQOO 是 MQ 開放選項,MQGMO 是 MQ 獲取消息選項。

為了子孫後代,這是一個(我認為)基於 mamboking 和 jmucchiello 答案的方法的改進版本。

Public Function GetMessage(ByVal correlID As Byte()) As MQMessage
   Dim waitInterval = CInt(ConfigurationManager.AppSettings("responseTimeoutMS"))
   Dim q As MQQueue = Nothing
   Try
       Dim msg As New MQMessage()
       Dim getOpts As New MQGetMessageOptions()
       q = ConnectToResponseQueue()
       msg.MessageId = MQC.MQMI_NONE
       msg.CorrelationId = correlID
       getOpts.MatchOptions = MQC.MQMO_MATCH_CORREL_ID
       getOpts.WaitInterval = waitInterval
       getOpts.Options = MQC.MQGMO_BROWSE_FIRST Or MQC.MQGMO_WAIT
       q.Get(msg, getOpts)
       Return msg
   Finally
       If q IsNot Nothing AndAlso q.IsOpen() Then q.Close()
   End Try
End Function

引用自:https://stackoverflow.com/questions/1039240