我一直在尝试在我的一个应用程序中调整 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 上执行。
但是我得到的结果非常失望。我发现,如果您要多次回复(如我的订阅者逻辑中的执行顺序),则从处理程序中,一旦处理程序执行范围结束,所有消息都会一起发送到发布者队列。
如果我错了,请纠正,如果有人有,请提出任何解决方案。我可以通过线程实现相同的目标。但我不想自己管理它,所以有什么异步方法可以在代码回复时将消息推送到队列中。