1

我一直在尝试在我的一个应用程序中调整 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);
    }
}

现在,在这个实现之后,我期待的是:我现在应该能够通过接收SearchStarted消息来计算正在执行的订阅者的数量SearchProductSaga;一旦订阅者完成了业务逻辑,就会发送SearchCompleted消息来指示 saga - 我们完成了。并MarkAsComplete();在 saga 上执行。

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

如果我错了,请纠正,如果有人有,请提出任何解决方案。我可以通过线程实现相同的目标。但我不想自己管理它,所以有什么异步方法可以在代码回复时将消息推送到队列中。

4

1 回答 1

1

您遇到的结果是消息在队列事务中处理,所有传出消息也都在队列事务中发送

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

这也意味着您必须将您的 saga 操作划分为多个离散的步骤,以实现您所追求的目标。

那有意义吗?

于 2013-08-02T21:37:06.677 回答