处理大量JMS消息类型

时间:2017-02-17 14:03:10

标签: java design-patterns jms activemq

我是jms的新手,我正在设计一款BattleShip游戏。 我正在使用带有activemq的jms进行它们之间的通信,到目前为止,我为jms通信创建了4个类,它们是Topic和Queue接收器和发送器,具有更改目标和发送的简单方法。

现在我想要处理这些消息时遇到问题, 我已经决定每条消息都将通过ObjectMessage传递,内部对象将告诉监听器如何处理它。

我有5种不同的消息类别: 身份验证, 数据(如高分,重放等), InGameMessages(ShipRegistration,TurnUpdate等), ChatMessage, MatchMakingMessages(仅限GameSearch和GameSearchCancel),

所以我认为为每条消息添加MessageType枚举是个好主意, 但最终我最终在switch语句中编写了超过20个案例的监听器,并且有大量的类铸件。

现在我想再写一遍,但我仍然坚持消息处理,因为我找不到不同的想法,或任何可以处理这个问题的设计模式。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

是可以使用" MessageType"的值设置JMS属性。枚举:JMSType是一个内置属性,您可以使用它,或者您可以将自己的属性添加到每条消息(名称如" MessageType")在客户端,请阅读消息并测试该属性的值并将其转换回枚举。在switch语句中,然后根据与消息关联的类的对象执行消息的转换,仅使用一个主题,每个客户端订阅该主题。您可以根据JMS选择器为每个消息类型设置一个侦听器,而不是switch语句,每个选择器只选择一个JMS属性值(即MessageType)。当然,所有这些都取决于您的使用情况(严格的订购等)

答案 1 :(得分:0)

您可以针对不同的消息类别使用不同的主题/队列。

您还可以为邮件添加属性。

您可以使用像spring这样的框架,特别是class CountWords(): var_one = "hello world" # this is the attribute count_words = CountWords() # instantiate the class print(count_words.var_one) # access the class' attribute 。看看spring jms

编辑:

我可以看到一些您可以查看的设计模式:MessageListenerAdapter,可能是Chain of ResponsabilityObserver

这里的要点是你只有一个处理程序,它将处理所有类型的消息,读取属性然后决定如何处理它。解决方案可能是拥有许多处理程序,一种是按消息类型,并找到一种方法将消息路由到正确的处理程序。

EventListener可以在这里做到这一点:将消息传递给链的第一个处理程序,如果它与消息有关,那么它可以处理它,否则它会将消息传递给下一个处理程序,并且等等。