我正在编写服务器/客户端游戏,典型场景如下所示:一个客户端(clientA)向服务器发送消息,服务器中有一个MessageDrivenBean来处理此类消息。在MDB完成其工作后,它将结果消息发送回另一个客户端(clientB)。
在我看来,我只需要两个队列进行这种通信,一个用于输入另一个用于输出。为每个连接创建新队列不是一个好主意,对吧? 输入队列是相对清晰的,如果有更多的客户端同时发送消息,消息只是在队列中等待,而服务器中有更多的MDB实例,这不应该是一个很大的性能问题。
但另一方面我不太清楚输出队列,我应该使用主题而不是队列吗?每个客户端都在侦听输出队列,其中一个获取新消息并检查属性以确定消息是否属于它,如果没有,则回滚事务,消息返回队列并为其他客户端做好准备...应该工作但必须非常慢。如果我改为使用主题,则每个客户端都会获得一条消息副本,如果不是,则忽略该消息。它会更好,对吧?
我是关于消息系统的新手。关于我的实施是否有任何建议?谢谢!
答案 0 :(得分:1)
首先,选择JMS作为游戏平台是不寻常的 - 企业使用JMS代理提供交付可靠性和交易支持。在游戏中你真的需要这种沉重的生命吗?您是否应该使用自己的基于HTTP的协议,例如?
也就是说,两个队列是点对点通信的标准模式。为新连接创建队列绝对不行 - 消息驱动的bean在部署时附加到队列,因此您将无法响应队列创建事件。此外,队列并不意味着在短周期内被创建和销毁,它们被设计为长寿命实体。如果需要向一个精确的客户端发送消息,请让客户端侦听服务器响应队列,并设置消息选择器以仅过滤用于此客户端的消息(请参阅javax.jms.Message
API)。
有了主题,就像你所说的那样 - 每个连接的客户端都会获得一条消息的副本 - 所以再次向 n 客户端发送一条必须被丢弃的消息并不是一个好的模式。 n-1 个客户。
答案 1 :(得分:1)
MADA;
您可以粘贴一个输出队列(或主题),只需使用标识标记目标客户端的标记来标记该消息。然后,客户端可以使用选择器侦听队列/主题。希望您的JMS实现具有高效的服务器端侦听器评估。