2012-03-28 28 views
13

Tôi có một MSMQ riêng được tạo trong máy cục bộ của mình. Tôi đang gửi tin nhắn đến hàng đợi bằng cách sử dụng mã C# sau. Khi tôi thay đổi hàng đợi thành giao dịch, thông báo không đạt được MSMQ. Tuy nhiên, không có ngoại lệ nào được ném trong phương thức Gửi. Tôi cần phải thay đổi gì để làm cho nó hoạt động?Tin nhắn không đạt được MSMQ khi thực hiện giao dịch

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

Tôi đoán là các giao dịch cần phải được cam kết. http://msdn.microsoft.com/en-us/library/windows/desktop/ms701273(v=vs.85).aspx –

Trả lời

6

mỗi MSDN, đây là một ví dụ của việc sử dụng một hàng đợi MSMQ giao dịch:

// 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(); 
    } 

Bạn cần phải đối xử với nó như một giao dịch DB - bắt đầu giao dịch bằng cách tạo ra các giao dịch MSMQ mới, và sau đó hoặc cam kết hoặc hủy bỏ hoạt động.

2

Hàng đợi và loại thông báo cần phải giống nhau - giao dịch trong trường hợp này. Nếu bạn không nhận được ngoại lệ thì hãy sử dụng Nhật ký nguồn phủ định trong mã của bạn để giúp tìm thư bị mất.

20

Đối với hàng đợi mà bạn đã tạo làm chuyển tiếp, bạn phải sử dụng phiên bản Send() bao gồm thông số MessageQueueTransactionType. Sự thất vọng lớn nhất với điều này là nó không ném bất kỳ ngoại lệ hoặc lỗi như bạn đã thấy, nhưng thông điệp chỉ không bao giờ xuất hiện.

Vì vậy, trong mã của bạn, thay đổi:

helpRequestQueue.Send(theMessage); 

để

helpRequestQueue.Send(theMessage, MessageQueueTransactionType.Single); 

Chỉnh sửa: Câu trả lời của tôi chỉ là một cách để làm điều đó sang một bên từ David.

13

Giao dịch không hoạt động trên non-transactional queues. Nếu bạn sử dụng biểu mẫu này:

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

Trên hàng đợi không truyền, thông báo dường như bị mất và không có ngoại lệ nào sẽ bị ném. Bạn có thể kiểm tra xem hàng đợi có giao dịch trong thuộc tính cho hàng đợi trong bảng điều khiển quản lý xếp hàng thư hay không.

Nó tốt hơn để sử dụng

queue.Send(message, MessageQueueTransactionType.Automatic) 
Các vấn đề liên quan