是否可以关联 MassTransit Saga 中不基于 ID 的消息?
Is it possible to to correlate a message in MassTransit Saga that is not based on a ID?
是否可以将传入消息与没有 Id 或 属性 的 1 对 1 相关性的传奇相匹配?我正在考虑做类似下面的事情,但 CorrelateBy
似乎没有滋润传奇或触发任何处理。
public interface SubmitOrder
{
Guid OrderId { get; }
string[] ItemIds { get; }
}
public interface ItemStockExhausted
{
string Id { get; }
}
public class OrderState :
SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string[] ItemIds { get; set; }
public int CurrentState { get; set; }
}
public class OrderStateMachine :
MassTransitStateMachine<OrderState>
{
public OrderStateMachine()
{
InstanceState(x => x.CurrentState);
Event(() => SubmitOrder, x
=> x.CorrelateById(context => context.Message.OrderId)
);
Event(() => ItemStockExhausted, x
=> x.CorrelateBy((state, context) => state.ItemIds.Contains(context.Message.Id))
);
Initially(
When(SubmitOrder)
.Then(x => x.Instance.ItemIds = x.Data.ItemIds)
.TransitionTo(Submitted));
During(Submitted,
When(ItemStockExhausted)
.Then(x => { /* Do something */ })
);
}
public Event<SubmitOrder> SubmitOrder { get; private set; }
public Event<ItemStockExhausted> ItemStockExhausted { get; private set; }
public State Submitted { get; private set; }
}
不确定它是否有任何区别,但我正在使用 MongoDB 持久性。
对于支持查询的 Saga 持久性提供程序,可以通过查询进行关联。 MongoDB 持久性提供程序支持使用查询,但您需要记住,不是 LINQ 查询可以正确转换为 MongoDB 查询。
对于您的情况,我建议启用 MongoDB 查询跟踪,就像在这个问题中建议的那样:
一些持久性提供程序,特别是那些使用像 Redis 这样的键值数据库的提供程序,不支持通过查询进行关联,但它们通常会在您尝试使用查询时立即抛出 "unsupported" 异常。
是否可以将传入消息与没有 Id 或 属性 的 1 对 1 相关性的传奇相匹配?我正在考虑做类似下面的事情,但 CorrelateBy
似乎没有滋润传奇或触发任何处理。
public interface SubmitOrder
{
Guid OrderId { get; }
string[] ItemIds { get; }
}
public interface ItemStockExhausted
{
string Id { get; }
}
public class OrderState :
SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public string[] ItemIds { get; set; }
public int CurrentState { get; set; }
}
public class OrderStateMachine :
MassTransitStateMachine<OrderState>
{
public OrderStateMachine()
{
InstanceState(x => x.CurrentState);
Event(() => SubmitOrder, x
=> x.CorrelateById(context => context.Message.OrderId)
);
Event(() => ItemStockExhausted, x
=> x.CorrelateBy((state, context) => state.ItemIds.Contains(context.Message.Id))
);
Initially(
When(SubmitOrder)
.Then(x => x.Instance.ItemIds = x.Data.ItemIds)
.TransitionTo(Submitted));
During(Submitted,
When(ItemStockExhausted)
.Then(x => { /* Do something */ })
);
}
public Event<SubmitOrder> SubmitOrder { get; private set; }
public Event<ItemStockExhausted> ItemStockExhausted { get; private set; }
public State Submitted { get; private set; }
}
不确定它是否有任何区别,但我正在使用 MongoDB 持久性。
对于支持查询的 Saga 持久性提供程序,可以通过查询进行关联。 MongoDB 持久性提供程序支持使用查询,但您需要记住,不是 LINQ 查询可以正确转换为 MongoDB 查询。
对于您的情况,我建议启用 MongoDB 查询跟踪,就像在这个问题中建议的那样:
一些持久性提供程序,特别是那些使用像 Redis 这样的键值数据库的提供程序,不支持通过查询进行关联,但它们通常会在您尝试使用查询时立即抛出 "unsupported" 异常。