我一直在尝试在我的一个应用程序中调整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
消息来指示传奇故事——我们完成了。并对传奇执行MarkAsComplete();
。
但我得到的结果是相当失望。我发现,从处理程序中,如果您多次回复(就像我的订阅者逻辑中的执行序列一样),一旦处理程序执行范围结束,所有消息都会一起发送到发布者队列。
如果我错了,请纠正,如果有人有,请提出任何解决方案。我可以通过穿线达到同样的效果。但我不想自己管理它,所以有没有任何异步方式可以在代码回复时将消息推送到队列。
您所经历的是消息在队列事务中处理的结果,所有传出消息也在该事务中发送。
这意味着,所有发送的消息,即使它们可能已经发送到您使用的任何排队系统,在提交事务之前,都不会发送给任何人。
这也意味着你必须将你的传奇行动分为多个离散的步骤,才能实现你想要的。
这有道理吗?