2015-09-28 182 views
3

我有這個下面的代碼(逐字),我希望產生一個錯誤:檢測MSMQ錯誤

using System.Messaging; 

namespace MsmqTest 
{ 
    class Program 
    { 
     static void Main() 
     { 
      string invalidQueue = @"FormatName:DIRECT=OS:sometrahsname\private$\anothertrahsname"; 
      Enqueue("test",invalidQueue); 

     } 

     private static void Enqueue(object o, string queueName) 
     { 
      using (MessageQueue msmq = new MessageQueue(queueName)) 
      using (MessageQueueTransaction transaction = new MessageQueueTransaction()) 
      { 
       msmq.DefaultPropertiesToSend.Recoverable = true; 
       transaction.Begin(); 
       msmq.Send(new Message(o), transaction); 
       transaction.Commit(); 
      } 
     } 
    } 
} 

在這裏,我們是不存在的服務器上發送消息到隊列。我期望收到一個跡象表明出現了問題。我沒有得到任何。如何在這種情況下檢查錯誤?

注意:爲了運行上面的代碼,您需要在您的機器上安裝MSMQ。

+3

大概[MSDN博客:是否存在MSMQ隊列檢查是艱苦的工作(http://blogs.msdn.com/b/johnbreakwell/archive/2008/07/31/checking-if-msmq -queue-exist-is-hard-work-so-should-you-bother.aspx)應該能夠啓發你的任務 –

+0

注意最後一個語句'msm.Close()'不是必需的; '使用'將完成這項工作。也不需要「交易」,因爲您只需做一件事(添加到消息隊列中)。 –

+0

@RichardSchneider你是對的,至少對於System.Messaging的4.0版本。我在反射器中打開它並確保'Dispose'調用'Close'。一般來說,這並不能保證,所以如果你不想在反射器中檢查你碰巧使用的每個類,這是一個很好的預防措施。我將編輯該問題以刪除它。 –

回答

1

我在之前的一個應用程序中偶然發現過這個問題。 MSDN記錄了在MessageQueue.Send中,消息可能會發送到死信隊列而不會引發異常。這就是你現在正在經歷的。我所做的是檢查隊列是否存在。

using System; 
using System.Messaging; 

namespace MsmqTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string invalidQueue = @"FormatName:DIRECT=OS:sometrahsname\private$\anothertrahsname"; 
      Enqueue("test", invalidQueue); 
     } 

     private static void Enqueue(object o, string queueName) 
     { 
      try 
      { 
       MessageQueue msmq = null; 
       //check if queueName exists 
       //it also validates if you have access to MSMQ server 
       if (!MessageQueue.Exists(queueName)) 
       { 
        msmq = MessageQueue.Create(queueName); 

        //you can also set the permission here 
        //because the other application that may be reading 
        //has different account with the application that created the queue 
        //set to Everyone for demonstration purposes 
        msmq.SetPermissions("Everyone", MessageQueueAccessRights.FullControl); 
       } 
       else 
       { 
        msmq = new MessageQueue(queueName); 
       } 

       using (msmq) 
       { 
        using (MessageQueueTransaction transaction = new MessageQueueTransaction()) 
        { 
         msmq.DefaultPropertiesToSend.Recoverable = true; 
         transaction.Begin(); 
         msmq.Send(new Message(o), transaction); 
         transaction.Commit(); 
        } 
       } 
      }catch(Exception) 
      { 
       //handle error here 
      } 
     } 
    } 
} 
+1

「不能調用Exists(String)來驗證是否存在遠程專用隊列。」 - https://msdn.microsoft.com/en-us/library/system.messaging.messagequeue.exists(v=vs.110).aspx – niksofteng