2013-10-11 46 views
1

我们有一堆计划发布到队列中的请求。我如何知道所有订阅者何时完成?

会有几种不同的订户类型,每个订户类型都在他们自己的循环池中。

例如Request1被压入队列

LoggingSubscriber1和LoggingSubscriber2与“LoggingSubscriber” subscriptionId两个订阅,使得只有它们中的一个获取请求。

将会有其他团体如DoProcessSubscriber1,DoProcessSubscriber2和DoProcessSubscriber3

而另一DoOtherProcessSubscriber1,DoOtherProcessSubscriber2

我们需要一些方法来知道,所有这三个用户(日志,DoProcess和DoOtherProcess)已经完成,以便我们可以执行一些操作...例如向客户端发送一条消息,表明所有请求都已完成。

我们如何汇总这样的回答?我们正在考虑让每个用户在队列中放置一个响应对象,但我们仍然不确定如何知道它们全部完成。

+0

我建议你在RequestObject中使用某种计数器,这样每个用户在完成工作后就会增加它,然后你可以将这个计数器与期望值进行比较(为你 - 3)并决定。不要忘了,这个计数器将在多线程环境中共享资源,所以需要某种同步 –

+0

的,我不想硬编码的值,如果我们添加其他用户类型,我们不应该理想地需要修改配置预期值。我相信物品会保留在队列中,直到所有订户都确认正确为止?那么当时没有办法让事情发生吗? – CaffGeek

+0

正如你知道有多少用户在你的列表 - 比较不硬编码的价值,但这个长度 –

回答

1

理想情况下,您可以使用EasyNetQ中内置的请求/响应模式,但这是为单个(潜在的养殖)客户设计的。它不允许你绑定到多个队列。在你的情况下,你应该让你的客户端为回复设置一个订阅,并让所有三个服务完成后发布一条消息。然后客户端可以等待,直到它有更新前的所有三个响应。

但是,我鼓励你可能会重新考虑你的设计。通过让客户负责确认订户的完成情况,您正在构建一个紧密耦合的系统。如果您采用最终一致性的概念,则消息传递系统设计会更好。允许你的客户开火并忘记,并有一些审计过程确保所有预期的处理最终发生。

相关问题