2012-03-28 56 views
13

我在本地機器中創建了私人MSMQ。我使用以下C#代碼將消息發送到隊列。當我將隊列更改爲事務性時,消息未到達MSMQ。但是,Send方法中不會引發異常。我需要做些什麼才能使其工作?製作交易時郵件未達到MSMQ

using System; 
using System.Messaging; 
using System.Data; 

public partial class _Default : System.Web.UI.Page 
{ 
    //Sharing violation resulted from queue being open already for exclusive receive. 
    MessageQueue helpRequestQueue = new MessageQueue(@".\Private$\MyPrivateQueue", false); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     bool isTransactionalQueue = false;  
     if (!System.Messaging.MessageQueue.Exists(@".\Private$\MyPrivateQueue"))  
     {  
      System.Messaging.MessageQueue.Create(@".\Private$\MyPrivateQueue", isTransactionalQueue);  
     }  
     SendMessage();  
     GetAllMessages();  
    } 


    private void SendMessage()  
    {  
     System.Messaging.Message theMessage = new System.Messaging.Message("TimeNow is "+DateTime.Now.ToString()); 

     theMessage.Label = "Lijo " + DateTime.Now.ToString(); 

     theMessage.Priority = System.Messaging.MessagePriority.Normal; 

     helpRequestQueue.Send(theMessage);  

    } 


    private void GetAllMessages() 
    {  
     DataTable messageTable = new DataTable();  
     messageTable.Columns.Add("Label");  
     messageTable.Columns.Add("Body");   


     //Set Message Filters  
     MessagePropertyFilter filter = new MessagePropertyFilter();  
     filter.ClearAll();  
     filter.Body = true;  
     filter.Label = true;  
     filter.Priority = true; 
     helpRequestQueue.MessageReadPropertyFilter = filter; 

     //Get All Messages  
     System.Messaging.Message[] messages = helpRequestQueue.GetAllMessages();  
     System.Messaging.XmlMessageFormatter stringFormatter = new System.Messaging.XmlMessageFormatter(new string[] { "System.String" }); 


     for (int index = 0; index < messages.Length; index++)  
     {  
      string test = System.Convert.ToString(messages[index].Priority); 
      messages[index].Formatter = stringFormatter;  
      messageTable.Rows.Add(new string[] {messages[index].Label,messages[index].Body.ToString() }); 

     } 


     Gridview1.DataSource = messageTable;  
     Gridview1.DataBind();  
    }  

    private void ReceiveAndProcess()  
    { 



    }   
} 
+2

我的猜測是,該交易需要提交。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms701273(v=vs.85).aspx – 2012-03-28 16:41:56

回答

6

MSDN,這裏使用事務MSMQ隊列的例子:

// Connect to a transactional queue on the local computer. 
    MessageQueue queue = new MessageQueue(".\\exampleTransQueue"); 

    // Create a new message. 
    Message msg = new Message("Example Message Body"); 

    // Create a message queuing transaction. 
    MessageQueueTransaction transaction = new MessageQueueTransaction(); 

    try 
    { 
     // Begin a transaction. 
     transaction.Begin(); 

     // Send the message to the queue. 
     queue.Send(msg, "Example Message Label", transaction); 

     // Commit the transaction. 
     transaction.Commit(); 
    } 
    catch(System.Exception e) 
    { 
     // Cancel the transaction. 
     transaction.Abort(); 

     // Propagate the exception. 
     throw e; 
    } 
    finally 
    { 
     // Dispose of the transaction object. 
     transaction.Dispose(); 
    } 

你必須把它像一個數據庫事務 - 通過創建新的MSMQ交易開始交易,然後提交或中止操作。

2

隊列和消息類型需要相同 - 在這種情況下是事務性的。 如果您沒有發現異常,請在代碼中使用負面日誌記錄來幫助查找丟失的郵件。

20

對於您創建爲跨規則的隊列,必須使用包含MessageQueueTransactionType參數的Send()版本。最令人沮喪的是,它沒有像你所看到的那樣拋出任何異常或錯誤,但是這個信息並沒有出現。

所以,在你的代碼,更改:

helpRequestQueue.Send(theMessage); 

helpRequestQueue.Send(theMessage, MessageQueueTransactionType.Single); 

編輯:我的答案是另一種方式,從大衛的做它放在一邊。

13

交易不能在non-transactional queues上工作。如果您使用此表格:

using(MessageQueueTransaction tx = new MessageQueueTransaction()) 
{ 
    tx.Begin(); 
    queue.Send(message, tx); 
    tx.Commit(); 
} 

在非事務性隊列上,消息似乎丟失,不會引發異常。您可以在消息隊列管理控制檯中檢查隊列的屬性中是否有事務性的隊列。

這是更好地使用

queue.Send(message, MessageQueueTransactionType.Automatic)