【发布时间】:2019-07-27 15:15:58
【问题描述】:
我们如何跟踪进入 Java 消息队列的每条消息?我们需要保存消息以供以后参考。我们已经将它记录到应用程序日志 (log4j) 中,但我们需要稍后查询它们。
【问题讨论】:
标签: java message-queue
我们如何跟踪进入 Java 消息队列的每条消息?我们需要保存消息以供以后参考。我们已经将它记录到应用程序日志 (log4j) 中,但我们需要稍后查询它们。
【问题讨论】:
标签: java message-queue
你可以存储它们
【讨论】:
您可以为消息创建一个数据库日志表,将消息按原样存储在 BLOB 列中,将其创建/发布到 MQ 的时间戳和一个简单的计数器作为主键存储。如果您想创建已发送消息的统计报告,还可以添加消息类型等字段。
可以通过使用时间戳列删除所有早于保留期的消息来完成表的清理。
【讨论】:
我过去实现过这样的解决方案,我们选择将消息及其所有特征存储在数据库中,并在此基础上开发了一个搜索、重播和取消应用程序。这是Message Store 模式:
(来源:eaipatterns.com)
我们也将此应用程序用于Dead Letter Channel。
(来源:eaipatterns.com)
如果您不想构建自定义解决方案,请查看 CodeStreet 的 ReplayService for JMS。
【讨论】:
最好的方法是使用中间件提供商提供的任何跟踪工具。或者,您可以设置一个中间侦听器,其唯一工作就是记录消息并转发到您现有的应用程序。
在大多数情况下,您会发现中间件提供商已经有能力为您执行此操作,而无需您的应用程序进行更改或感知。
【讨论】:
我会将队列更改为主题,然后保留处理消息的原始使用者,并添加另一个用于审核消息到数据库的使用者。
一些 JMS 提供者满足主题到队列桥的定义,然后消费者从他们自己的专用队列接收,并且不必读取由于其他消费者不活动而留在队列中的过去消息。
或者,您可以编写一个 log4j 附加程序,它将您记录的消息写入数据库。
【讨论】: