根据自定义属性从 ActiveMQ 队列中过滤/删除重复消息

Filter / drop duplicate messages from ActiveMQ queue based on custom properties

问题

当我的 Web 应用程序更新数据库中的项目时,它通过 Camel 将包含项目 ID 的消息发送到 ActiveMQ 队列,其消费者将更新外部服务 (Solr)。外部服务独立读取数据库。

我想要的是,如果 Web 应用程序发送另一条具有相同项目 ID 的消息,而旧消息仍在队列中,则丢弃新消息以避免 运行 Solr 更新两次。

在处理更新请求并且具有该项目 ID 的消息离开队列后,应再次接受具有相同 ID 的新请求。

有没有办法让这项工作开箱即用?我真的很想放弃 ActiveMQ 并简单地将更新请求队列实现为具有唯一约束的数据库 table,按时间戳或 运行 插入 ID 排序。

到目前为止我尝试了什么

我已阅读 Whosebug 上的 this and this 页面。这些是那里提到的解决方案:

PS: 我发现 another SO page 问了同样的事情却没有答案。

你想要的不是消息代理功能,跟着我重复,"A message broker is not a database, A message broker is not a database",根据需要重复。

经纪人的工作是可靠地从 A 点到 B 点获取消息。客户端通过消息选择器提供一些过滤功能,但这是最小的,主要用于只阻止单个客户端感兴趣的特定消息流向那里而不是其他客户可能负责处理的其他人。

如您所述,您的用例需要一个更有状态的以数据库为中心的解决方案。创建一个代理插件来遍历队列以检查消息是在重新发明轮子,并且如果队列深度很大则容易出错,因为 ActiveMQ 甚至可能不会根据内存限制为您分页所有消息。