【问题标题】:Masstransit Sagas - Events not publishingMasstransit Sagas - 事件未发布
【发布时间】:2018-10-14 05:07:48
【问题描述】:

尝试使用 MT 和 Automatonymous 进行 saga 设置,但是没有点击,文档很薄,不清楚我的配置有什么问题。

我可以看到生成总线的队列,然后是状态机的主题。但是,当我发布事件时,什么也没有发生。没有例外,队列或主题中没有任何内容。

设置和注册:

        var repository = new InMemorySagaRepository<MyObJect>();
        var _machine = new MyStateMachine();

        var _busControl = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
       {
           var host = cfg.Host("omitted", h => { });

           cfg.UseSerilog(logger);

           cfg.ReceiveEndpoint(host, "test", e =>
           {
               e.StateMachineSaga(_machine, repository);
           });
           cfg.UseServiceBusMessageScheduler();
       });

        _busControl.Start();

状态机:

public class MyStateMachine:
        MassTransitStateMachine<MyObJect>
{
    public MyStateMachine()
    {
        InstanceState(x => x.CurrentState);

        this.Event(() => this.ItemAdded, x => x.CorrelateById(c => c.Message.CorrelationId).SelectId(c => c.Message.CorrelationId));
        this.Event(() => this.ItemSubmitted, x => x.CorrelateById(c => c.Message.CorrelationId));

        Initially(
            When(ItemAdded)
            .ThenAsync(context =>
            {
                return context.Data.AddItem();
                //Update everything you need to on the current instance of the state machine
            })
            .TransitionTo(Added)
            );

        During(Added,
            When(ItemSubmitted)
            .Then(ct => ct.Data.SubmitItem())
            .TransitionTo(Submitted)
            .Finalize()
            );

        SetCompletedWhenFinalized();
    }

    public Event<ItemAdded> ItemAdded { get; private set; }

    public Event<ItemSubmitted> ItemSubmitted { get; private set; }

    public State Added { get; private set; }

    public State Submitted { get; private set; }
}

public class ItemSubmitted
{
    public string ItemId { get; set; }
    public string EntityId { get; set; }
    public System.Guid CorrelationId { get; set; }

    public void SubmitItem()
    {
        System.Threading.Thread.Sleep(30000);
        Console.WriteLine("Submitted the item");
    }
}

public class ItemAdded
{
    public string ItemId { get; set; }
    public string EntityId { get; set; }
    public System.Guid CorrelationId { get; set; }

    public Task AddItem()
    {
        return Task.FromResult(true);
    }
}

状态机实例:

public class MyObJect: SagaStateMachineInstance
{
    public string CurrentState { get; set; }
    public string EntityId { get; set; }
    public string ItemId { get; set; }
    public Guid CorrelationId { get; set; }
}

通过以下方式发布事件:

_busControl.Publish<MyObJect>(new MyObJect { EntityId = "123", ItemId = "435", CorrelationId = Guid.NewGuid() }).Wait();

请原谅糟糕的代码和人为的例子 - 我把它煮成了一个小安全带,以便更容易地绕开它

【问题讨论】:

    标签: masstransit


    【解决方案1】:

    您似乎误解了什么是传奇状态。 saga state 是你的状态机的状态。它包含您的流程的数据,并被持久化到数据库中。

    您需要消息来推动您的传奇,这就是您需要使用的定义

    public Event<ItemAdded> ItemAdded { get; private set; }
    

    如果您想通过ItemAdded 事件启动saga,并在收到ItemSubmitted 事件时继续,您需要发布ItemAdded。 MyObject 是 saga 状态,不是消息类型。

    【讨论】:

    • 我无法用言语来形容我现在的感觉有多愚蠢。交换了 ItemAdded 的发射事件和 PublishAsync 的类型约束,瞧。我知道这很容易被我忽略。谢谢
    • @Alexey Zimarev,你能在这里回答我的 MassTransit 问题吗:stackoverflow.com/questions/56516412/…?我想我会问,因为我发现您的其他一些答案很有帮助。
    • @w0051977 我认为将 cmets 用于此目的不是一个好主意...我们确实有一个 Gitter 频道,文档指向您那里,很多人会很乐意提供帮助.我不使用“遗留”sagas,所以很遗憾,我并不真正了解细节。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多