2011-10-24 85 views
1

我正在编写服务器/客户端游戏,一个典型的场景如下所示:一个客户端(clientA)向服务器发送消息,服务器中有一个MessageDrivenBean来处理此类消息。 MDB完成其作业后,会将结果消息发送回另一个客户端(clientB)。关于JMS系统结构

在我看来,我只需要两个队列进行这种通信,一个用于输入另一个用于输出。为每个连接创建新的队列不是一个好主意,对吧? 输入队列相对清晰,如果有更多的客户端同时发送消息,则消息只是在队列中等待,而服务器中有更多的MDB实例,这不应该是一个很大的性能问题。

但在另一方面,我不太清楚输出队列,我应该使用主题而不是队列吗?每个客户端正在监听输出队列,其中一个获取新消息并检查属性以确定消息是否属于该消息,如果不是,则回滚事务,消息返回队列并准备好用于其他客户端... It应该工作,但一定很慢。如果我使用topic,每个客户端都会得到一份消息副本,如果不是这样,就会忽略消息。它应该会更好,对吧?

我是新的消息系统。有没有关于我的实施的建议?谢谢!

回答

1

首先,选择JMS作为游戏平台很不寻常—企业使用JMS代理提供可靠性和交易支持。你真的需要一场比赛中的沉重打击吗?例如,你不应该诉诸于你自己的基于HTTP协议吗?

也就是说,两个队列是点对点通信的标准模式。为新连接创建队列绝对不行—消息驱动的bean在部署时连接到队列,因此您将无法响应队列创建事件。此外,排队不是要在短周期内创建和销毁,而是设计成长生存的实体。如果您需要向一个精确的客户端发送消息,请让客户端在服务器响应队列中侦听,并设置一个消息选择器,以仅过滤旨在用于此客户端的消息(请参阅javax.jms.Message API)。

随着主题是完全按照您注意—每个连接的客户端会再次得到消息—的副本,这不是一个好的模式通过n-1个发送给ň客户端将被废弃的消息客户。

+0

感谢您的回答。现在我对JMS更加清楚了。顺便说一句。我使用JMS是因为前端使用flash,我使用blazeds消息系统与java后端进行通信。 http绝对是一种选择,但blazeds消息系统具有服务器数据推送功能,这意味着不必每秒都查询服务器响应,客户端在收到响应时立即获得响应。所以我决定使用jms。 – cn1h

+0

@ cn1h随着服务器将数据推送到客户端,这是有道理的。你有这样的技术是很好的,谢谢你的解释。 – MaDa

1

MaDa;

您可以粘贴一个输出队列(或主题),并简单地标记带有标识预期客户端的标头的消息。然后,客户端可以使用选择器监听队列/主题。希望您的JMS实现具有高效的服务器端侦听器评估。