【发布时间】:2015-03-24 22:34:16
【问题描述】:
问题
当我的 Web 应用程序更新数据库中的项目时,它会通过 Camel 将包含项目 ID 的消息发送到 ActiveMQ 队列,该队列的使用者将获得更新的外部服务 (Solr)。外部服务独立读取数据库。
我想要的是,如果 Web 应用程序发送另一条具有相同项目 ID 的消息,而旧消息仍在队列中,则删除新消息以避免运行 Solr 更新两次。
在处理完更新请求并且具有该项目 ID 的消息离开队列后,应再次接受具有相同 ID 的新请求。
有没有办法让这项工作开箱即用?我真的很想放弃 ActiveMQ 并简单地将更新请求队列实现为具有唯一约束的数据库表,按时间戳或正在运行的插入 ID 排序。
到目前为止我尝试了什么
我已阅读 Stackoverflow 上的 this 和 this 页面。这些是那里提到的解决方案:
Camel 中的幂等消费者:在这里,我可以指定一个表达式来定义构成重复的内容,但这也会阻止所有未来发送相同消息的尝试,即更新相同的项目。我只想在新的更新请求仍在队列中时丢弃它们。
“ActiveMQ 已经进行重复检查,看看
auditDepth!”:嗯,这看起来是一个好的开始,并且肯定最接近我想要的,但这决定了基于我无法设置的消息 ID。所以或者我找到了一种方法让 ActiveMQ 以某种方式为这个队列生成消息 ID或者我找到了一种方法来让审计内容查看我的项目 ID 字段而不是消息 ID。 (一个comment in my second link 甚至建议使用“您在标题上设置的定义明确的属性”,但未能解释如何。)编写一个自定义插件,如果传入消息与队列中已经存在的消息匹配,则将它们重定向到死信队列。这似乎是迄今为止提供的最完整的解决方案,但对于我认为是相当平凡的日常任务来说,它感觉太过分了。
PS:我发现another SO page 提出同样的问题而没有答案。
【问题讨论】:
标签: jms apache-camel activemq