3

次のようなハンドラーがあります。

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)は呼び出されませんでした。私は夜の睡眠を失い、脳を破壊し、インターネットをくまなく調べて、どこにボールを落としたのかについての手がかりを探しました. もう 1 つ、CreateNewUserHandler が通常のハンドラー (非サガ) に変換される場合、上記のメソッドが呼び出されます。

これらは、私が続けなければならない唯一の手がかりです(そして、それほど多くはありません-エラーがもっと意味のあるものであることを本当に望んでいました)

2013-05-17 14:30:29,682 [Worker.18] WARN MyProject.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - ID=377f1e49 のメッセージの「トランスポート メッセージ受信」イベントの発生に失敗しました-06e2-465f-877a-9443828e8866 System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません。c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1331 の NServiceBus.Unicast.UnicastBus の NServiceBus.Unicast.UnicastBus.HandleTransportMessage(IBuilder childBuilder, TransportMessage msg) で。 System.EventHandler`1.Invoke(オブジェクト送信者、TEventArgs e) の c:\TeamCity\buildAgent\work\nsb.master_7\src\unicast\NServiceBus.Unicast\UnicastBus.cs:line 1248 の TransportMessageReceived(オブジェクト送信者、TransportMessageReceivedEventArgs e) ) NServiceBus.Unicast で。

また、

2013-05-17 14:30:29,591 [Worker.18] INFO NServiceBus.Sagas.Impl.SagaDispatcherFactory [(null)] <(null)> - ID を持つメッセージ タイプ 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; }
}

そして佐賀クラス自体:

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; }
}
4

2 に答える 2

5

私に飛び出すことがいくつかあります。

最初に、Configure.With() の後、.CreateBus() の前に、初期化コードで .Sagas() を呼び出してみてください。

また、saga の Bus 依存関係を削除します。NServiceBus には、saga クラスで既に定義されているものがあります。

CreateNewUser の ConfigureMapping 呼び出しを削除します (サガごとにこのメッセージの複数のインスタンスを受信することが予想される場合を除く)。

最後に、[Unique]saga データの CorrelationID プロパティに属性を設定します (メッセージが並行して処理された場合に複数の saga にならないようにするため)。

于 2013-05-18T06:02:58.393 に答える