我在 Masstransit 中定义了以下状态机:
public class OrderStateMachine : MassTransitStateMachine<OrderState>
{
public OrderStateMachine()
{
InstanceState(x => x.Status);
Event(() => OrderCreated, x => x.CorrelateBy(order => order.OrderCode, ctx => ctx.Message.OrderCode).SelectId(ctx => NewId.NextGuid()));
//How should I select an id for these events?
Event(() => OrderProvisioned, x => x.CorrelateBy(order => order.OrderCode, ctx => ctx.Message.OrderCode));
Event(() => OrderInvoiced, x => x.CorrelateBy(order => order.OrderCode, ctx => ctx.Message.OrderCode));
State(() => Created);
State(() => Finished);
CompositeEvent(() => OrderFinished, order => order.CompositeStatus, OrderProvisioned, OrderInvoiced);
Initially(
When(OrderCreated)
.Then(context => Console.WriteLine("Order created"))
.TransitionTo(Created)); …Run Code Online (Sandbox Code Playgroud) 我有一个MassTransitStateMachine,它编排一个涉及创建多个事件的过程.
一旦完成所有事件,我希望状态转换到"清理"阶段.
这是相关的状态声明和过滤功能:
During(ImportingData,
When(DataImported)
// When we get a data imported event, mark this source as done.
.Then(MarkImportCompletedForLocation),
When(DataImported, IsAllDataImported)
// Once all are done, we can transition to cleaning up...
.Then(CleanUpSources)
.TransitionTo(CleaningUp)
);
...snip...
private static bool IsAllDataImported(EventContext<DataImportSagaState, DataImportMappingCompletedEvent> ctx)
{
return ctx.Instance.Locations.Values.All(x => x);
}
Run Code Online (Sandbox Code Playgroud)
因此,虽然状态是ImportingData,但我希望收到多个DataImported事件.每个事件都将其位置标记为已完成,以便IsAllDataImported方法可以确定是否应该转换到下一个状态.
但是,如果最后两个DataImported事件同时到达,则转换到CleaningUp阶段的处理程序将触发两次,最后我尝试执行两次清理.
我可以在自己的代码中解决这个问题,但我期待状态机能够管理它.我做错了什么,或者我只是需要自己处理争用?
我在传奇中有一些状态并尝试实施状态检查重试,直到我在收到的消息中得到一些令人满意的值.
说,我有这样的事情:
.During(Pending,
When(StatusChecked)
.TransitionTo(somethingThatDependsOnStatusCheckedData)
Run Code Online (Sandbox Code Playgroud)
我只能提供特定的状态,TransitionTo但我希望它根据收到的消息内容进行转换,是否可能?
我正在尝试使用 Automatonymous 和 RabbitMQ 为状态机实现一个简单的示例/演示。不幸的是,我找不到一个可以重建/学习的东西(我找到了ShoppingWeb,但在我看来它绝不简单)。同样在我看来,文档缺乏信息。
这是我想到的状态机示例(对不起,它很丑):
请注意,这个例子完全是虚构的,它是否有意义并不重要。这个项目的目的是让 Automatonymous 变得“温暖”。
我想做/拥有的是:
我的状态机实现如下所示:
public class InterpreterStateMachine : MassTransitStateMachine<InterpreterInstance>
{
public InterpreterStateMachine()
{
InstanceState(x => x.CurrentState);
Event(() => Requesting, x => x.CorrelateBy(request => request.Request.RequestString, context => context.Message.Request.RequestString)
.SelectId(context => Guid.NewGuid()));
Event(() => Validating, x => x.CorrelateBy(request => request.Request.RequestString, context => context.Message.Request.RequestString));
Event(() => Interpreting, x => x.CorrelateBy(request => request.Request.RequestString, context => context.Message.Request.RequestString));
Initially(
When(Requesting)
.Then(context =>
{
context.Instance.Request = new Request(context.Data.Request.RequestString);
}) …Run Code Online (Sandbox Code Playgroud) 我试图了解服务之间的消息传递中使用的不同方法。
假设我们有一个场景,我需要第一个服务来通知另一个用户已请求创建产品,第二个服务应收到此消息,创建一个产品,然后响应告诉第一个服务一个产品已被使用。创建。
我认为命令和请求/响应一起适合这种情况,因为第一个服务将需要处理另一个特定的服务并等待反馈。
我的理解是:
事件与命令:
大事记:
命令:
请求/响应与发布/订阅:
请求/响应:
在请求/响应中,第一个服务请求对方执行一个操作,并等待直到后面的响应返回为止。
发布/订阅:
第一服务仅发布消息并继续处理,而无需等待反馈或响应。
现在,我开始使用RabbitMQ和Masstransit saga(Masstransit.Automatonymous)一起设计消息传递系统,该事件似乎使用发布/订阅方法跟随事件。
我的问题是:
如何在发布中使用命令或在请求/响应中使用事件?
我的理解正确吗?可以将sagas与请求/响应一起使用吗?
我设法通过一系列活动实施了 MassTransit Courier 路由单。我决定添加一个状态机来监控它,所以我创建了单独的事件和状态,并使用 EF Core 作为 Automatonymous 状态机的存储。为了跟踪当前状态,我在每个活动执行结束时发布一个事件。一切正常,我可以监控数据库中路由单的当前状态。
但这是最好的方法吗?根据 MassTransit 文档中的这一部分:https ://masstransit-project.com/advanced/courier/events.html看起来事件应该自动发布。那么也许有另一种方法来监控路由单,它不需要创建事件并在每个活动中手动发布它们?
我是 MassTransit 的新手,我似乎无法弄清楚它如何将我在 saga (MassTransitStateMachine) 上定义的状态映射到相关 SagaStateMachineInstance 类上的“State”属性。
例如,如果我有一个具有三种状态的状态机类:
public class MySaga :
MassTransitStateMachine<MySagaState>
{
public State Executing { get; private set; }
public State Completed { get; private set; }
public State Failed { get; private set; }
...
}
Run Code Online (Sandbox Code Playgroud)
我的状态机实例类有一个“State”属性
public class MySagaState : SagaStateMachineInstance
{
public Guid CorrelationId { get; set; }
public int State { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MT 如何决定哪个 saga 状态是哪个整数?
似乎还有两个内置 saga 状态:“初始”和“最终”,因此此示例将有 5 个状态。状态到整数的映射是如何完成的?
消费者传奇究竟是什么,它与 Automatonymous 有何不同?我知道 Automatonymous 是 MassTransit 使用的一个单独的库。