在 2 个系统之间发送 JMS 消息
Sending JMS messages between 2 systems
我有 2 个系统,其中系统 A 必须向系统 B 发送消息。我是 JMS 的新手,所以我不太清楚如何实现它。我正在考虑使用消息代理 (ActiveMQ) 来发送消息。因此,系统 A 将消息发送到队列,B 中的消息监听器将使用这些消息。系统 B 中有许多用户,我希望在用户登录系统时显示这些消息。所以我的问题是,如果系统 B 即使在用户未登录时也继续使用消息,他们怎么能看到已经使用的消息?
我应该将使用的消息存储在数据库中吗?我不明白这是怎么回事。
您可以让 SystemB 读取所有消息并充当 JMS 和系统本身之间的网关,即将每个用户消息存储在数据库中,当用户登录时,从数据库中读取这些消息并显示它们。如果用户必须承认他们已经阅读了每条消息,这可能是一个更好的解决方案,因为您可以跟踪他们是否已经阅读了所有消息,并在他们承认他们已经阅读时从数据库中删除每条消息。
另一种解决方案可能是 virtual topics and queues。消息发送到的单个主题被分成 queues,每个用户一个。当用户登录时,SystemB 从该用户的 queue 中读取。这与应用程序的域(此时是 JMS)是分开的,因此消息被标记为已使用并被 ActiveMQ 从 queue 中删除。如果用户不阅读它并需要在下次登录时看到它,那么您需要数据库解决方案。
它本质上是两个域的交汇点。用户需要查看的信息来自 JMS,它有自己的规则(消费的消息、从 queue 中删除等)。然后信息进入您的应用程序的域,该域可能具有不同的规则(必须阅读、为下次登录保存等)。
如果用户长时间不登录,他们的 queue 可能会填满并且无法再接收任何消息,而如果消息始终被读取并存储在数据库 他们登录的频率并不重要,因为数据库应该更好地保存大量消息。
另一种选择是 topic per user and messages are sent to those topics but other systems would need to know which users are in your system, which probably isn't a good idea. Or you could use Apache Camel to route incoming messages on the main topic to user topics. The messages would need to be durable and transacted in case the broker went down. When a user logs in, read from the topic to get all their messages. You can route based on content 或 headers。
您的问题是消息持久性和/或重新传递之一。有几种方法:
- JMS 持久订阅:您可以对系统 B 的主题进行持久订阅,并且仅在用户登录时使用消息。当您没有收到 () 消息时,您的消息将在代理处保留直到你再次调用 receive() 。如果 A 持续发送消息,所有这些都由 ActiveMQ 代理保存在磁盘上。
- JMS 队列:系统 A 将消息放入队列,系统 B 不会接收消息,除非用户已登录。队列会变大,直到您再次从系统 B 调用 receive()。类似于持久化订阅,但是对于队列,每条消息只能有一个消费者。使用持久订阅可以更轻松地配置系统 B 的容错版本...
- 为 n 次传递添加一个 'replay server':系统 A 发布到一个主题(可以是非持久的),第三个组件 (C) 也将订阅每条消息并持久保存到磁盘。当系统 B 需要再次查看消息时,它可以向系统 C 询问这些消息,最好支持 from_time 或类似的消息。
我有 2 个系统,其中系统 A 必须向系统 B 发送消息。我是 JMS 的新手,所以我不太清楚如何实现它。我正在考虑使用消息代理 (ActiveMQ) 来发送消息。因此,系统 A 将消息发送到队列,B 中的消息监听器将使用这些消息。系统 B 中有许多用户,我希望在用户登录系统时显示这些消息。所以我的问题是,如果系统 B 即使在用户未登录时也继续使用消息,他们怎么能看到已经使用的消息? 我应该将使用的消息存储在数据库中吗?我不明白这是怎么回事。
您可以让 SystemB 读取所有消息并充当 JMS 和系统本身之间的网关,即将每个用户消息存储在数据库中,当用户登录时,从数据库中读取这些消息并显示它们。如果用户必须承认他们已经阅读了每条消息,这可能是一个更好的解决方案,因为您可以跟踪他们是否已经阅读了所有消息,并在他们承认他们已经阅读时从数据库中删除每条消息。
另一种解决方案可能是 virtual topics and queues。消息发送到的单个主题被分成 queues,每个用户一个。当用户登录时,SystemB 从该用户的 queue 中读取。这与应用程序的域(此时是 JMS)是分开的,因此消息被标记为已使用并被 ActiveMQ 从 queue 中删除。如果用户不阅读它并需要在下次登录时看到它,那么您需要数据库解决方案。
它本质上是两个域的交汇点。用户需要查看的信息来自 JMS,它有自己的规则(消费的消息、从 queue 中删除等)。然后信息进入您的应用程序的域,该域可能具有不同的规则(必须阅读、为下次登录保存等)。
如果用户长时间不登录,他们的 queue 可能会填满并且无法再接收任何消息,而如果消息始终被读取并存储在数据库 他们登录的频率并不重要,因为数据库应该更好地保存大量消息。
另一种选择是 topic per user and messages are sent to those topics but other systems would need to know which users are in your system, which probably isn't a good idea. Or you could use Apache Camel to route incoming messages on the main topic to user topics. The messages would need to be durable and transacted in case the broker went down. When a user logs in, read from the topic to get all their messages. You can route based on content 或 headers。
您的问题是消息持久性和/或重新传递之一。有几种方法:
- JMS 持久订阅:您可以对系统 B 的主题进行持久订阅,并且仅在用户登录时使用消息。当您没有收到 () 消息时,您的消息将在代理处保留直到你再次调用 receive() 。如果 A 持续发送消息,所有这些都由 ActiveMQ 代理保存在磁盘上。
- JMS 队列:系统 A 将消息放入队列,系统 B 不会接收消息,除非用户已登录。队列会变大,直到您再次从系统 B 调用 receive()。类似于持久化订阅,但是对于队列,每条消息只能有一个消费者。使用持久订阅可以更轻松地配置系统 B 的容错版本...
- 为 n 次传递添加一个 'replay server':系统 A 发布到一个主题(可以是非持久的),第三个组件 (C) 也将订阅每条消息并持久保存到磁盘。当系统 B 需要再次查看消息时,它可以向系统 C 询问这些消息,最好支持 from_time 或类似的消息。