.net Rhino服务总线事务

.net Rhino服务总线事务,.net,asp.net-mvc-4,rhino-servicebus,.net,Asp.net Mvc 4,Rhino Servicebus,我能够使用Rhino服务总线和Sql Server Express创建一个测试应用程序。我有一个MVC4前端,它可以创建一条消息并将其发送到队列,还可以在我的数据库表中创建一条记录。我有一个windows服务,它从队列中获取消息并写入一个单独的数据库表。我希望消息send/database write为全部或无。例如,如果消息发送或数据库写入失败,我希望能够回滚它们。我尝试将它们都包装在TransactionScope中,但是根据我的测试,消息被发送到队列中,即使没有作用域 这可能吗?如果是这样

我能够使用Rhino服务总线和Sql Server Express创建一个测试应用程序。我有一个MVC4前端,它可以创建一条消息并将其发送到队列,还可以在我的数据库表中创建一条记录。我有一个windows服务,它从队列中获取消息并写入一个单独的数据库表。我希望消息send/database write为全部或无。例如,如果消息发送或数据库写入失败,我希望能够回滚它们。我尝试将它们都包装在TransactionScope中,但是根据我的测试,消息被发送到队列中,即使没有作用域

这可能吗?如果是这样,有人能给我指出正确的方向吗

仅供参考…这些队列是MSMQ事务性队列


谢谢。

我在Rhino Service Bus Google Groups网站上发布了同样的问题,并得到了Oren的回复。原来RSB将处理事务,但我使用的是IOnewayBus,它不使用DTC。我更改为使用IStartableServiceBus,现在一切正常。

Rhino Service bus出现问题,隐式所有事务都被登记到环境事务(MSDTC)中。这在一段时间内还可以,但我们运行了许多长时间运行的进程,这些进程将花费一个多小时的时间(DTC的最大超时时间为一小时)。为了解决这个问题,我创建了一个IMessageModule的实现,如下所示:

/// <summary>
/// alows commands to opt-in to ambient transaction (MSDTC)
/// </summary>
/// <remarks>will supress by default</remarks>
public class SuppressAmbientTransactionMessageModule : IMessageModule
{

    [ThreadStatic]
    private static TransactionScope transactionScope;

    public void Init(ITransport transport, IServiceBus serviceBus)
    {
        transport.MessageArrived += TransportOnMessageArrived;
        transport.BeforeMessageTransactionCommit += transport_BeforeMessageTransactionCommit;
        transport.BeforeMessageTransactionRollback += transport_BeforeMessageTransactionCommit;
    }

    public void transport_BeforeMessageTransactionCommit(CurrentMessageInformation currentMessageInformation)
    {
        if (!(currentMessageInformation.Message is IWithAmbientTransaction))
        {
            transactionScope.Dispose();
        }
    }

    public void Stop(ITransport transport, IServiceBus bus)
    {
        transport.MessageArrived -= TransportOnMessageArrived;
        transport.BeforeMessageTransactionCommit -= transport_BeforeMessageTransactionCommit;
        transport.BeforeMessageTransactionRollback -= transport_BeforeMessageTransactionCommit;
    }

    public bool TransportOnMessageArrived(CurrentMessageInformation currentMessageInformation)
    {
        if (!(currentMessageInformation.Message is IWithAmbientTransaction))

        {
            transactionScope = new TransactionScope(TransactionScopeOption.Suppress);
        }
        return false;
    }
}
//
///选择加入环境事务(MSDTC)的alows命令
/// 
///默认情况下是否会取消
公共类SuppressAmbientTransactionMessageModule:IMessageModule
{
[线程静态]
私有静态事务范围事务范围;
public void Init(ITransport transport,IServiceBus服务总线)
{
transport.MessageArrived+=TransportOnMessageArrived;
transport.BeforeMessageTransactionCommit+=transport\u BeforeMessageTransactionCommit;
transport.BeforeMessageTransactionRollback+=transport\u BeforeMessageTransactionCommit;
}
公共无效传输\u在MessageTransactionCommit之前(CurrentMessageInformation CurrentMessageInformation)
{
如果(!(currentMessageInformation.Message是IWithAmbientTransaction))
{
transactionScope.Dispose();
}
}
公共空站(ITransport transport、伊瑟维塞布斯巴士)
{
transport.MessageArrived-=TransportOnMessageArrived;
transport.BeforeMessageTransactionCommit-=transport\u BeforeMessageTransactionCommit;
transport.BeforeMessageTransactionRollback-=transport\u BeforeMessageTransactionCommit;
}
公共布尔传输消息驱动(CurrentMessageInformation CurrentMessageInformation)
{
如果(!(currentMessageInformation.Message是IWithAmbientTransaction))
{
transactionScope=新transactionScope(TransactionScopeOption.Suppress);
}
返回false;
}
}
我还创建了一个名为IWithAmbientTransaction的无方法接口,以使特定命令能够登记到环境事务中。虽然拥有这样长时间运行的流程并不理想,但这种方法已经解决了我们当前面临的长时间运行事务的问题