【问题标题】:NServiceBus saga not workingNServiceBus 传奇不起作用
【发布时间】:2013-05-18 01:36:00
【问题描述】:

我有一个如下所示的处理程序:

public class CreateNewUserHandler :
    Saga<UncorroboratedCreateNewUser>,
    IAmStartedByMessages<CreateNewUser>,
    IHandleMessages<FoundUser>
{

    [Dependency]
    public IBus Bus { get; set; }


    public override void ConfigureHowToFindSaga()
    {        
        ConfigureMapping<CreateNewUser>(saga => saga.CorrelationId, req => req.CorrelationId);
        ConfigureMapping<FoundUser>(saga => saga.CorrelationId, foundUser => foundUser.CorrelationId); //CorrelationId is of type Guid here
    }

    public void Handle(CreateNewUser message)
    {
        Mapper.DynamicMap(message, Data, typeof(CreateNewUser), typeof(UncorroboratedCreateNewUser));
        Data.CorrelationId = message.CorrelationId;
        Bus.Send(new FindUserByUserName { CorrelationId = Data.CorrelationId, UserName = message.UserName });
    }


    public void Handle(FoundUser message)
    {
        //**THIS BLOCK WAS NEVER HIT**
    }
}

现在应该回复FoundUser 的其他处理程序是这样的:

public class FindUserByUserNameHandler : IMessageHandler<FindUserByUserName>
{
    private readonly UserRepository _userRepository;
    public IBus Bus { get; set; }

    public FindUserByUserNameHandler(UserRepository  userRepository)
    {
        _userRepository = userRepository;
    }

    public void Handle(FindUserByUserName message)
    {
        var foundUser  = _userRepository.FindByUserName(message.UserName);
        FoundUser result = Bus.CreateInstance<FoundUser>( _ => _.CorrelationId = message.CorrelationId);
        if (foundUser != null)
        {
            result = Mapper.DynamicMap<FoundUser>(foundUser);
            result.IsUserFound = true;
        }
        else
        {
            result.
                AuthenticationUserName = message.UserName;
            result.IsUserFound = false;
        }

        Bus.Reply(result);
    }
}

在调试中,我已经能够跟踪进入 CreateNewUser => FindUserByName => 回复的消息,并且观察跟踪日志,它甚至看起来消息返回到原始队列。

然而,void Handle(FoundUser message) 方法从未被调用过!我已经失去了一个晚上的睡眠,破坏了我的大脑并在互联网上寻找关于我可能在哪里丢球的线索。如果要将 CreateNewUserHandler 转换为常规处理程序(非 saga),则会调用上面的方法!

这些是我必须继续下去的唯一线索(而且并不多 - 我真的希望这个错误更有意义)

2013-05-17 14:30:29,682 [Worker.18] 警告 MyProject.Unicast.Transport.Transactional.TransactionalTransport [(null)] - 未能引发“收到传输消息”事件 对于 ID=377f1e49-06e2-465f-877a-9443828e8866 的消息 System.NullReferenceException:对象引用未设置为实例 的一个对象。在 NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder,TransportMessage 消息)在 c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1331 在 NServiceBus.Unicast.UnicastBus.TransportMessageReceived(对象 发件人,TransportMessageReceivedEventArgs e) 在 c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1248 在 System.EventHandler`1.Invoke(对象发送者,TEventArgs e)在 NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage 味精)在 c:\TeamCity\buildAgent\work\nsb.master_7\src\impl\unicast\transport\NServiceBus.Unicast.Transport.Transactional\TransactionalTransport.cs:line 480

还有

2013-05-17 14:30:29,591 [Worker.18] 信息 NServiceBus.Sagas.Impl.SagaDispatcherFactory [(null)] - 可以 找不到消息类型 MyProject.Messages.FoundUser 的传奇 编号 377f1e49-06e2-465f-877a-9443828e8866。要去调用 SagaNotFoundHandlers。

并且以防万一需要配置:

NServiceBus.Configure.With(busAssemblies)
                        .Log4Net()
                        .License(Config.Default.NServiceBus_License)
                        .DefineEndpointName(endPointName) 
                        .UnityBuilder(serviceBusDiConfiguration.Container)
                        .DontUseTransactions() //I don't know why this is needed, but doesn't seem to get very far otherwise.
                        .AzureConfigurationSource()
                        .AzureSagaPersister()
                        .AzureSubcriptionStorage()
                        .AzureDataBus()
                        .JsonSerializer()
                        .AzureServiceBusMessageQueue()
                        .UnicastBus()
                        .LoadMessageHandlers()
                        .CreateBus()
                        .Start();
   BusConfiguration.Configurer.ConfigureComponent(uoWImplementer, DependencyLifecycle.InstancePerUnitOfWork); //For the custom unitOfWork

请帮忙!

=====================下面的消息 DTO======================= ===

public class CreateNewUser : ICommand
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
    public Guid CorrelationId { get; set; }
}

public class FindUserByUserName : IMessage
{
    public Guid CorrelationId { get; set; }
    public string UserName { get; set; }
}

public class FoundUser: IMessage
{
    public bool IsUserFound { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string AuthenticationUserName { get; set; }
    public Guid CorrelationId { get; set; }
}

还有 saga 类本身:

public class UncorroboratedCreateNewUser : IContainSagaData
{
    public virtual Guid Id { get; set; }
    public virtual string Originator { get; set; }
    public virtual string OriginalMessageId { get; set; }
    public virtual string FirstName { get; set; }
    public virtual string LastName { get; set; }
    public virtual string UserName { get; set; }
    public virtual string Password { get; set; }
    public virtual Guid CorrelationId { get; set; }
}

【问题讨论】:

  • 你能告诉我们你的消息的定义吗?
  • 以上更新,谢谢

标签: c# .net azure soa nservicebus


【解决方案1】:

有几件事让我很震惊。

首先,尝试在 Configure.With() 之后和 .CreateBus() 之前在初始化代码中调用 .Sagas()。

另外,移除对 saga 的 Bus 依赖 - NServiceBus 已经在 saga 类上定义了它。

删除 CreateNewUser 的 ConfigureMapping 调用(除非您希望每个 saga 接收到此消息的多个实例)。

最后,在您的 saga 数据的 CorrelationID 属性上添加一个 [Unique] 属性(以保证如果消息被并行处理,您最终不会得到多个 saga)。

【讨论】:

    【解决方案2】:

    我认为映射代码会覆盖CorrelationId

    result = Mapper.DynamicMap<FoundUser>(foundUser);
    

    最后分配CorrelationId

    【讨论】:

    • 克里斯,这很可能是我的代码中的一个错误,但在另一种情况下,它找不到用户,我手动设置 CorrelationId,传奇仍然失败。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多