2013-04-04 19 views
7

Tôi đang sử dụng IBM.XMS lib để nói chuyện với WebSphereMQ.Người dùng không đồng bộ và sử dụng TransactionScope

Khi nhận tin nhắn bằng cách sử dụng phương pháp đồng bộ, ví dụ:

using (var scope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) 
{ 
     message = consumer.Receive(1000); 

     if (message != null) 
     { 
      //Do work here 
      scope.Complete(); 
     } 
} 

Nhưng nếu tôi muốn sử dụng phương pháp đồng bộ:

consumer.MessageListener = delegate(IMessage msg) 
{ 
    //Do work here 
    //But where do I put TransactionScope? 
}; 

Tôi không thể làm việc ra làm thế nào để quấn MessageListener callback trong một số TransactionScope.

Có ai biết cách thực hiện việc này không?

+0

Nếu phiên bản người dùng đã được tạo từ phiên, phiên có thể đã được tạo để có giao dịch xung quanh (Transaction.Current) trong quá trình chạy ủy nhiệm. –

Trả lời

1

Trình nghe tin nhắn aka Không đồng bộ người tiêu dùng không thể được sử dụng trong một TransactionScope khi trình nghe tin nhắn chạy trên một chủ đề khác với chuỗi tạo ra TransactionScope. Bạn chỉ có thể sử dụng tính năng Nhận/Gửi đồng bộ bên trong một số TransactionScope.

Điều này link cho biết "Giao dịch XA không được hỗ trợ trong người tiêu dùng không đồng bộ".

+0

Cảm ơn! Nó sẽ thực sự tốt đẹp nếu phiên bản tiếp theo sẽ hỗ trợ các giao dịch XA với người tiêu dùng không đồng bộ ;-) Liệu IBM có một số loại dịch vụ thông minh? –

+0

Có. Bạn có thể gửi RFE tại: https://www.ibm.com/developerworks/rfe/?BRAND_ID=181. Khi trên trang này, hãy nhấp vào liên kết "gửi RFE". – Shashi

+0

Tuyệt, tôi đã gửi nó (http://www.ibm.com/developerworks/rfe/execute?use_case=viewRfe&CR_ID=33621), vui lòng bỏ phiếu lên :) –

1

Cũng có thể đáng giá khi bạn điều tra bằng cách sử dụng DependentClone để tạo một DependentTransaction.

"Giao dịch phụ thuộc là giao dịch mà kết quả của nó phụ thuộc vào kết quả của giao dịch mà từ đó nó được nhân bản."

"DependentTransaction là bản sao của đối tượng Transaction được tạo bằng phương thức DependentClone. Mục đích duy nhất của nó là cho phép ứng dụng đến nghỉ ngơi và đảm bảo rằng giao dịch không thể thực hiện trong khi công việc vẫn đang được thực hiện trên giao dịch (đối với ví dụ, trên một chuỗi công nhân). "

Chỉnh sửa: Chỉ cần phát hiện này trong liên quan SO danh sách câu hỏi: related question and answer thấy liên kết MSDN họ cung cấp: cũng có giá trị một đọc Managing Concurrency with DependentTransaction

Taken từ liên kết MSDN trên (cho ngắn gọn):

public class WorkerThread 
{ 
    public void DoWork(DependentTransaction dependentTransaction) 
    { 
     Thread thread = new Thread(ThreadMethod); 
     thread.Start(dependentTransaction); 
    } 

    public void ThreadMethod(object transaction) 
    { 
     DependentTransaction dependentTransaction = transaction as DependentTransaction; 
     Debug.Assert(dependentTransaction != null); 

     try 
     { 
      using(TransactionScope ts = new TransactionScope(dependentTransaction)) 
      { 
       /* Perform transactional work here */ 
       ts.Complete(); 
      } 
     } 
     finally 
     { 
      dependentTransaction.Complete(); 
      dependentTransaction.Dispose(); 
     } 
    } 

//Client code 
using(TransactionScope scope = new TransactionScope()) 
{ 
    Transaction currentTransaction = Transaction.Current; 
    DependentTransaction dependentTransaction;  
    dependentTransaction = currentTransaction.DependentClone(DependentCloneOption.BlockCommitUntilComplete); 
    WorkerThread workerThread = new WorkerThread(); 
    workerThread.DoWork(dependentTransaction); 

    /* Do some transactional work here, then: */ 
    scope.Complete(); 
} 
+0

Tôi cần thực sự dequeue của các tin nhắn để được nhập ngũ trong 'TransactionScope', tôi không thấy làm thế nào điều này sẽ giải quyết bất cứ điều gì! –

+0

Tại sao bạn không sử dụng MessageQueueTransaction? http://msdn.microsoft.com/en-us/library/system.messaging.messagequeuetransaction(v=vs.71).aspx –

+0

'MessageQueueTransaction' được sử dụng với' MessageQueue', MSMQ. Tôi không sử dụng MSMQ, tôi đang sử dụng WebSphereMQ –

Các vấn đề liên quan