Rebus pub/sub:异步方式回复来自订阅者的消息



我一直在尝试在我的一个应用程序中调整Rebus。易于配置,运行良好。必须实现PUB/SUB通信,以实现来自多个来源的响应。所以我做的是

  • Saga(Publisher)

SearchProductSaga : Saga<ProductSagaData>, IAmInitiatedBy<SearchProduct>, IHandleMessages<SearchStarted>, IHandleMessages<SearchProductResponse>, IHandleMessages<SearchCompleted>

Saga的输入队列为-ProductSaga.Queue

  • Subscriber 1包含以下执行顺序:

    public class ProductHanderl_1 : IHandleMessage<SearchProduct>
    {
        public void Handle(FullTextSearchProductRequest message)
        {
            Bus.Reply(SearchStarted);
            //Some business logic to find products
            Bus.Reply(AcutalProductResponse);
            Bus.Reply(SearchCompleted);
        }
    }
    
  • Subscriber 2

包含相同的执行序列但不同的业务逻辑:

public class ProductHanderl_2 : IHandleMessage<SearchProduct>
{
    public void Handle(FullTextSearchProductRequest message)
    {
        Bus.Reply(SearchStarted);
        //Some business logic to find products
        Bus.Reply(AcutalProductResponse);
        Bus.Reply(SearchCompleted);
    }
}

现在,在这个实现之后,我所期望的是:我现在应该能够通过接收SearchStartedSearchProductSaga的消息来计算执行订户的数量;一旦订阅者完成了业务逻辑,就会发送SearchCompleted消息来指示传奇故事——我们完成了。并对传奇执行MarkAsComplete();

但我得到的结果是相当失望。我发现,从处理程序中,如果您多次回复(就像我的订阅者逻辑中的执行序列一样),一旦处理程序执行范围结束,所有消息都会一起发送到发布者队列。

如果我错了,请纠正,如果有人有,请提出任何解决方案。我可以通过穿线达到同样的效果。但我不想自己管理它,所以有没有任何异步方式可以在代码回复时将消息推送到队列。

您所经历的是消息在队列事务中处理的结果,所有传出消息也在该事务中发送

这意味着,所有发送的消息,即使它们可能已经发送到您使用的任何排队系统,在提交事务之前,都不会发送给任何人。

这也意味着你必须将你的传奇行动分为多个离散的步骤,才能实现你想要的。

这有道理吗?

最新更新