我正在使用MassTransit Sagas。当传入事件(AccountCreatedInWebAppEvent)进行一些处理并开始发布时,它将开始 另一个事件(SagaAccountCreatedEvent)
我有一个使用者,它监听SagaAccountCreatedEvent,但在使用者中上下文。如果我未按下面的示例那样显式设置它,CorrelationId为null(返回新的SagaAccountCreatedEvent(){...})。由Saga-magic无需我将其添加到消息中就应该包含correlationId吗? (从消费者到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 };
})
消费者方法
公共异步任务消耗(ConsumeContext上下文) {
//here context.correlationId is null
}
答案 0 :(得分:1)
由于您的初始事件与int
属性相关,因此您正在使用SelectId(x => Guid.NewGuid())
初始化 instance 。要在发布后续事件时获得该值,应使用context.Instance.CorrelationId
,如下所示:
.Publish(context =>
new SagaAccountCreatedEvent()
{
Account = context.Data.Account,
CorrelationId = context.Instance.CorrelationId
})
您使用的值context.CorrelationId
来自传奇的消费上下文,并且仅在Guid使用CorrelationId直接关联的事件中显示。