7

我正在使用IBM.XMS 库与 WebSphereMQ 通信。

使用同步方式接收消息时,例如:

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

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

但是如果我想使用异步方法:

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

我不知道如何将MessageListener回调包装在TransactionScope.

有谁知道如何做到这一点?

4

2 回答 2

1

调查使用DependentClone创建DependentTransaction可能很值得。

“从属事务是一种事务,其结果取决于从中克隆它的事务的结果。”

“DependentTransaction 是使用 DependentClone 方法创建的 Transaction 对象的克隆。它的唯一目的是允许应用程序停止并保证在事务仍在执行工作时事务不能提交(例如,在工作线程)。”

编辑:刚刚在相关的 SO 问题列表中发现了这一点:相关问题和答案请参阅他们提供的 msdn 链接:非常值得一读使用 DependentTransaction 管理并发

取自上面的 MSDN 链接(为简洁起见):

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();
}
于 2013-04-11T09:53:57.530 回答
1

消息侦听器又名异步使用者不能在 a 中使用,TransactionScope因为消息侦听器运行在与创建TransactionScope. 您只能在TransactionScope.

链接显示“异步消费者不支持 XA 事务”。

于 2013-04-16T04:21:02.477 回答