Dot-Net
如何瀏覽 Websphere MQ 消息而不刪除它?
我正在編寫一個 .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