在两个系统之间发送JMS消息

时间:2018-02-08 09:51:46

标签: jms activemq messagebroker message-listener

我有两个系统,系统A必须向系统B发送消息。我是JMS的新手,所以我不知道如何实现这一点。我在考虑使用消息代理(ActiveMQ)来发送消息。因此,系统A将消息发送到队列,B中的消息侦听器将消耗这些消息。系统B中有许多用户,我希望每当用户登录系统时都会显示这些消息。所以我的问题是,如果系统B继续消费消息,即使用户没有登录,他们怎么能看到已经消费的消息? 我应该将消费的消息存储在数据库中吗?我不明白这是如何运作的。

2 个答案:

答案 0 :(得分:1)

您可以让SystemB读取所有消息并充当JMS与系统本身之间的网关,即将每个用户消息存储在数据库中,当用户登录时,从数据库中读取这些消息并显示它们。如果用户必须确认他们已经阅读了可能是更好的解决方案的每条消息,那么您可以跟踪他们是否已经全部阅读并从数据库中删除每个消息,因为他们已经认识到他们已经阅读过它

另一种解决方案可能是virtual topics and queues。将消息发送到的单个主题将拆分为队列,每个用户一个。当用户登录时,SystemB从该用户的队列中读取。这与应用程序的域(此时它的JMS)是分开的,因此消息被标记为已消耗,并由ActiveMQ从队列中取出。如果用户没有阅读它并且需要在下次登录时看到它,那么您需要数据库解决方案。

它主要是两个域相遇的地方。用户需要看到的信息来自JMS,它有自己的规则(消息消息,从队列中删除等)。然后,该信息将进入您的应用程序域,该域可能具有不同的规则(必须阅读,保存以便下次登录等)。

如果用户长时间没有登录,他们的队列可能会填满并且无法再接收任何消息,而如果消息总是被读取并存储在数据库中,那么它就不会#&# 39;无论他们登录的频率如何,因为数据库应该更好地保存大量的消息。

另一个选项是每个用户一个topic,并且会向这些主题发送消息,但其他系统需要知道您的系统中有哪些用户,这可能不是一个好主意。或者,您可以使用Apache Camel将主要主题上的传入消息路由到用户主题。如果经纪人倒闭,这些消息需要经久耐用并进行交易。当用户登录时,请从主题中读取以获取所有消息。您可以根据content或标题进行路由。

答案 1 :(得分:0)

您的问题是消息持久性和/或重新传递。有几种方法:

  1. JMS Durable订阅:您可以对来自系统B的主题进行持久订阅,并且仅在用户登录时使用消息。当您没有收到()消息时,您的消息将在您的代理处保留,直到你再次调用receive()。如果A持续发送消息,则所有这些都由ActiveMQ代理保存在磁盘上。
  2. JMS队列:系统A将消息放入队列,除非用户登录,否则系统B不会接收消息。队列将变大,直到您再次从系统B调用receive()。类似于持久订阅,但是对于一个队列,每条消息只能有一个消费者。通过持久订阅,可以更轻松地配置系统B的容错版本......
  3. 为n次传递添加'重播服务器':系统A发布到主题(可能是非持久的),第三个组件(C)也会订阅每条消息并持久保存到磁盘。当系统B需要再次查看消息时,它可以向系统C询问这些消息,理想情况是支持from_time或类似消息。