【问题标题】:Sending JMS messages between 2 systems在 2 个系统之间发送 JMS 消息
【发布时间】:2018-07-18 20:09:31
【问题描述】:

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

【问题讨论】:

    标签: jms activemq messagebroker message-listener


    【解决方案1】:

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

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

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

    如果用户长时间未登录,他们的队列可能会填满,无法接收更多消息,而如果消息始终被读取并存储在数据库中,则无关紧要他们登录的频率应该更好,因为数据库应该更好地保存大量消息。

    另一种选择是每个用户一个topic,并将消息发送到这些主题,但其他系统需要知道哪些用户在您的系统中,这可能不是一个好主意。或者,您可以使用Apache Camel 将传入的关于主要主题的消息路由到用户主题。这些消息需要是持久的并且可以处理,以防代理出现故障。当用户登录时,从主题中读取以获取他们的所有消息。您可以根据content 或标头进行路由。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-06-25
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 2016-01-11
        • 2018-07-30
        • 2012-01-07
        相关资源
        最近更新 更多