CorrelationId не включается при публикации из / в Saga - PullRequest
0 голосов
/ 07 ноября 2019

Я использую MassTransit Sagas. Он запускается, когда входящее событие (AccountCreatedInWebAppEvent) выполняет некоторую обработку, а затем публикует другое событие (SagaAccountCreatedEvent)

У меня есть потребитель, который прослушивает SagaAccountCreatedEvent, но для потребителя context.CorrelationId равен нулю, если я не установленэто явно, как в примере ниже (вернуть новый SagaAccountCreatedEvent () {...}). Не следует ли включить корреляцию без необходимости вставлять ее в сообщение с помощью магии саги? (то же самое относится к публикации от потребителя к Saga- «обработчику»)

InstanceState(i => i.CurrentState);
Event(() => AccountCreatedInWebAppEvent, e => e.CorrelateBy<int>(sagaState => sagaState.AccountId, context => context.Message.Account.AccountId)
                                                .SelectId(context => Guid.NewGuid()))

...

Initially(
    When(AccountCreatedInWebAppEvent)
        .Then(context =>
        {
            context.Instance.AccountId = context.Data.Account.AccountId;
            context.Instance.CreatedInWebApp = DateTime.Now; 
        })
        .TransitionTo(AccountCreatedSentOut)
        .Publish(context =>
        {
            return new SagaAccountCreatedEvent() { Account = context.Data.Account, CorrelationId = context.CorrelationId.Value };
        })

Метод-потребитель

public async Task Consume (Контекст ConsumeContext) {

//here context.correlationId is null

}

1 Ответ

1 голос
/ 07 ноября 2019

Поскольку ваше начальное событие коррелируется со свойством int, вы инициализируете экземпляр с SelectId(x => Guid.NewGuid()). Чтобы получить это значение при публикации последующего события, вы должны использовать context.Instance.CorrelationId, как показано:

.Publish(context =>
    new SagaAccountCreatedEvent() 
    {
        Account = context.Data.Account,
        CorrelationId = context.Instance.CorrelationId
    })

Значение, которое вы использовали, context.CorrelationId - из контекста потребления саги и присутствует только для событий. которые напрямую связаны с Guid с использованием CorrelationId.

...