NServiceBus saga not working

本文关键字:working not saga NServiceBus | 更新日期: 2023-09-27 18:14:16

我有一个处理程序看起来像这样:

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 => Reply,并盯着跟踪日志,它甚至看起来像消息使它返回到原始队列。

但是方法void Handle(FoundUser message)从未被调用!我一整晚都没睡好,脑子都坏了,我在网上找线索,想知道我可能在哪里出错了。另一件事,如果CreateNewUserHandler,被转换成一个常规的处理程序(非saga),上面的方法被调用!

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

2013-05-17 14:30:29,682[工人。]18]警告MyProject.Unicast.Transport.Transactional.TransactionalTransport[(null)] <(null)> -引发'收到传输消息'事件失败查询ID=377f1e49-06e2-465f-877a-9443828e8866的消息系统。NullReferenceException:对象引用没有设置为实例一个物体的。在NServiceBus.Unicast.UnicastBus.HandleTransportMessage (IBuilderchildBuilder, TransportMessage msg) inc: ' TeamCity ' buildAgent ' ' nsb.master_7 ' src '单播工作' NServiceBus.Unicast ' UnicastBus.cs:行1331在nservicebus . unicast . unicastbus . transportmessagerreceived (Objectsender, transportmessagerreceivedeventargs) inc: ' TeamCity ' buildAgent ' ' nsb.master_7 ' src '单播工作' NServiceBus.Unicast ' UnicastBus.cs:行1248 at System.EventHandler ' 1。调用(对象发送方,TEventArgs)NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived (TransportMessage味精)c: ' TeamCity ' buildAgent ' '工作nsb.master_7 ' src ' impl '单播'运输' NServiceBus.Unicast.Transport.Transactional ' TransactionalTransport.cs:行480

2013-05-17 14:30:29,591[工人。]18)信息NServiceBus.Sagas.Impl.SagaDispatcherFactory [(null)] <(null)> -可以没有找到消息类型MyProject.Messages.FoundUser的sagaid 377 f1e49 - 06 - e2 - 465 f - 877 a - 9443828 - e8866。要调用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; }
}

NServiceBus saga not working

有几件事引起了我的注意。

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

同时,移除对saga的Bus依赖——NServiceBus已经在saga类上定义了这个依赖。

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

最后,在您的传奇数据的CorrelationID属性上放置一个[Unique]属性(以保证如果消息是并行处理的,那么您最终不会得到多个传奇)。

我认为映射代码覆盖了CorrelationId

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

分配CorrelationId的最后一个