关于JMS系统结构

关于JMS系统结构,jms,client-server,message-queue,messaging,Jms,Client Server,Message Queue,Messaging,我正在编写一个服务器/客户端游戏,一个典型的场景是这样的:一个客户端(clientA)向服务器发送消息,服务器中有一个MessageDrivenBean来处理这些消息。MDB完成其工作后,将结果消息发送回另一个客户端(clientB) 在我看来,这种通信只需要两个队列,一个用于输入,另一个用于输出。为每个连接创建新队列不是一个好主意,对吗? 输入队列是相对清晰的,如果有更多的客户端同时发送消息,消息只是在队列中等待,而服务器中有更多的MDB实例,这应该不是一个大的性能问题 但另一方面,我不太清楚

我正在编写一个服务器/客户端游戏,一个典型的场景是这样的:一个客户端(clientA)向服务器发送消息,服务器中有一个MessageDrivenBean来处理这些消息。MDB完成其工作后,将结果消息发送回另一个客户端(clientB)

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

但另一方面,我不太清楚输出队列,我应该使用主题而不是队列吗?每个客户机都在侦听输出队列,其中一个客户机获取新消息并检查属性以确定消息是否发送给它,如果不是,它将回滚事务,消息返回到队列并为其他客户机做好准备…它应该可以工作,但速度必须非常慢。如果我改用topic,每个客户机都会得到消息的一个副本,如果不是它,就忽略消息。应该更好,对吧


我不熟悉信息系统。对我的实施有什么建议吗?谢谢

首先,选择JMS作为游戏平台是不寻常的——企业使用JMS代理来提供可靠性和事务支持。在游戏中你真的需要这么重的重量吗?例如,您不应该求助于您自己的基于HTTP的协议吗

也就是说,两个队列是点对点通信的标准模式。为新连接创建队列肯定是不合适的-消息驱动bean在部署时连接到队列,因此您将无法响应队列创建事件。此外,队列并不意味着在短周期内创建和销毁,而是设计为长寿的实体。如果您需要将消息传递给一个精确的客户机,请让客户机在服务器响应队列上侦听消息,并将消息选择器设置为仅过滤用于此客户机的消息(请参见
javax.jms.message
API)

对于主题,正如您所指出的,每个连接的客户端都将获得一份消息副本,因此,向n个客户端发送一条必须被n-1个客户端丢弃的消息不是一种好的模式。

MaDa


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

谢谢您的回答。现在我对JMS更清楚了。顺便说一句,我使用JMS是因为前端使用flash,我使用blazeds消息系统与java后端通信。http绝对是一个选项,但是blazeds消息系统有一个服务器数据推送功能,这意味着客户端不需要每秒查询服务器响应,而是在有响应时立即获得响应。所以我决定使用jms@cn1h,服务器将数据推送到客户端,这很有意义。很高兴你有这样的技术,谢谢你的解释。