这更像是一个概念性问题,并不适用于任何特定的编程语言。
我有两个实体相互通信,允许三种类型的消息:
现在每个实体都有两个线程:
两种可能的通信方案是:
所以问题是,读者线程如何处理被请求和未经请求的消息?
通过事件可以轻松处理未经请求的邮件。读者线程可以在工作线程上触发一个事件,表示它收到了查询或命令,工作线程可以做出相应的反应。
但请求的消息很难处理。工作线程发送查询,必须阻塞,直到收到响应或超时。工作线程如何让读者线程知道它正在等待响应,读者线程如何将响应与工作线程的特定查询联系起来,并将该响应传递回工作线程的执行?
我知道这已经在其他程序中完成了一百万次,所以标准做法是什么?
答案 0 :(得分:1)
[我使用了Windows Azure Service Bus消息传递实体,因为我对它很熟悉,但一般情况下,任何消息系统都应如此。]
假设您的实体名称是A和B.
有1个主题(pub-sub实体)和1个队列用于A和B之间的通信(因为您需要双向通信):主题-A2B&队列B2A。 A2B适用于从A到B的命令或从A到B和B2A的查询,如名称所示,适用于从B到A的响应。
典型的消息系统将提供MessageType属性 - 您可以设置它,然后区分您正在阅读的消息类型并相应地路由它:Example from Windows Azure ServiceBus Brokered Message。使用该属性 - 设置其查询,命令或响应。 这里的想法是 - 在B中收到消息时 - 您将收到使用订阅。你将有2个线程读取 - (一)只读命令(theSecondOne)只读取查询
对于UnSolicited消息 - 正如您所说,它易于处理。您需要做的就是
对于征求的消息 - 就像查询一样(名为Sessions的功能在这里会派上用场)。
HTH! SREE