我一直在尝试在我的一个应用程序中调整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();
。
但我得到的结果非常失望。我发现,如果您多次回复处理程序(如我的订阅者逻辑中的执行顺序),一旦处理程序执行范围结束,所有消息将一起发送到发布者队列。
如果我错了,请纠正,如果有人的话,建议任何解决方案。我可以通过线程实现相同的功能。但是我不想自己管理它,所以有没有任何异步方法将消息推送到队列中以及从代码中回复时。
答案 0 :(得分:0)
您所遇到的是在队列事务中处理消息的事实,其中所有外发消息也被发送。
这意味着所有已发送的邮件,即使它们已经发送到您正在使用的任何排队系统,也不会在提交交易之前发送给任何人。
这也意味着你必须将你的传奇行动分成多个不连续的步骤才能实现你所追求的目标。
这有意义吗?