标签: automatonymous

如何在不使用 Guid 的情况下关联大众运输状态机中的事件?

我在 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)

masstransit saga automatonymous

5
推荐指数
1
解决办法
2485
查看次数

处理多个事件的状态转换

我有一个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阶段的处理程序将触发两次,最后我尝试执行两次清理.

可以在自己的代码中解决这个问题,但我期待状态机能够管理它.我做错了什么,或者我只是需要自己处理争用?

masstransit automatonymous

5
推荐指数
1
解决办法
1725
查看次数

MassTransit Automatonymous saga中的条件转换

我在传奇中有一些状态并尝试实施状态检查重试,直到我在收到的消息中得到一些令人满意的值.

说,我有这样的事情:

.During(Pending,
    When(StatusChecked)
        .TransitionTo(somethingThatDependsOnStatusCheckedData)
Run Code Online (Sandbox Code Playgroud)

我只能提供特定的状态,TransitionTo但我希望它根据收到的消息内容进行转换,是否可能?

masstransit automatonymous

4
推荐指数
1
解决办法
1135
查看次数

如何在 C# 中使用 Automatonymous 实现状态机

我正在尝试使用 Automatonymous 和 RabbitMQ 为状态机实现一个简单的示例/演示。不幸的是,我找不到一个可以重建/学习的东西(我找到了ShoppingWeb,但在我看来它绝不简单)。同样在我看来,文档缺乏信息。

这是我想到的状态机示例(对不起,它很丑): 在此处输入图片说明 请注意,这个例子完全是虚构的,它是否有意义并不重要。这个项目的目的是让 Automatonymous 变得“温暖”。

我想做/拥有的是:

  • 正在运行的四个应用程序:
    1. 状态机本身
    2. “请求者”发送要解释的请求
    3. “验证器”或“解析器”检查提供的请求是否有效
    4. 解释给定请求的“解释器”
  • 这方面的一个例子可能是:
    • 请求者发送“x=5”
    • 验证器检查是否包含“=”
    • 口译员说“5”

我的状态机实现如下所示:

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)

c# masstransit state-machine rabbitmq automatonymous

4
推荐指数
1
解决办法
2444
查看次数

服务事件与命令之间的消息传递

我试图了解服务之间的消息传递中使用的不同方法。

假设我们有一个场景,我需要第一个服务来通知另一个用户已请求创建产品,第二个服务应收到此消息,创建一个产品,然后响应告诉第一个服务一个产品已被使用。创建。

我认为命令和请求/响应一起适合这种情况,因为第一个服务将需要处理另一个特定的服务并等待反馈。

我的理解是:

事件与命令:

大事记:

  • 提供服务之间的松散耦合。
  • 执行发布到所有队列,对此消息感兴趣的服务将选择它。

命令:

  • 执行发送到特定队列的操作,因此只有使用该队列接收的服务才会使用它。

请求/响应与发布/订阅:

请求/响应:

在请求/响应中,第一个服务请求对方执行一个操作,并等待直到后面的响应返回为止。

发布/订阅:

第一服务仅发布消息并继续处理,而无需等待反馈或响应。

现在,我开始使用RabbitMQ和Masstransit saga(Masstransit.Automatonymous)一起设计消息传递系统,该事件似乎使用发布/订阅方法跟随事件。

我的问题是:

如何在发布中使用命令或在请求/响应中使用事件?

我的理解正确吗?可以将sagas与请求/响应一起使用吗?

c# masstransit saga microservices automatonymous

3
推荐指数
1
解决办法
836
查看次数

如何正确监控 MassTransit Courier 路由单?

我设法通过一系列活动实施了 MassTransit Courier 路由单。我决定添加一个状态机来监控它,所以我创建了单独的事件和状态,并使用 EF Core 作为 Automatonymous 状态机的存储。为了跟踪当前状态,我在每个活动执行结束时发布一个事件。一切正常,我可以监控数据库中路由单的当前状态。

但这是最好的方法吗?根据 MassTransit 文档中的这一部分:https ://masstransit-project.com/advanced/courier/events.html看起来事件应该自动发布。那么也许有另一种方法来监控路由单,它不需要创建事件并在每个活动中手动发布它们?

c# masstransit automatonymous routing-slip courier

3
推荐指数
1
解决办法
158
查看次数

MassTransit Saga 状态到实例状态映射

我是 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 个状态。状态到整数的映射是如何完成的?

c# masstransit automatonymous

1
推荐指数
1
解决办法
2949
查看次数

大众运输中的消费者传奇与自动驾驶

消费者传奇究竟是什么,它与 Automatonymous 有何不同?我知道 Automatonymous 是 MassTransit 使用的一个单独的库。

masstransit automatonymous

1
推荐指数
1
解决办法
209
查看次数