【发布时间】:2014-09-25 22:45:33
【问题描述】:
背景
概括地说,我有一个 Java 应用程序,其中某些事件应该触发为当前用户执行的某个操作。但是,事件可能非常频繁,并且动作总是相同的。因此,当第一个事件发生时,我想将动作安排在不久的将来某个时间点(例如 5 分钟)。在该时间窗口内,后续事件不应执行任何操作,因为应用程序会看到已经安排了一个操作。一旦计划的操作执行完毕,我们就返回到第 1 步,下一个事件将重新开始循环。
我的想法是通过在应用程序本身中嵌入一个内存中的 ActiveMQ 实例来实现这种过滤和节流机制(我不关心队列持久性)。
我相信 JMS 2.0 支持延迟传递的概念,延迟消息位于“暂存队列”中,直到需要传递到真正的目的地。但是,我也相信 ActiveMQ 还不支持 JMS 2.0 规范......所以我正在考虑使用生存时间 (TTL) 值和死信队列 (DLQ) 处理来模仿相同的行为。
基本上,我的消息生产者代码会将消息放在一个虚拟暂存队列中任何消费者都不会从中提取任何东西。消息将被放置一个 5 分钟的 TTL 值,并且在到期时 ActiveMQ 会将它们转储到 DLQ 中。 那是我的消息消费者实际从中消费消息的队列。
问题
我不认为我想真正从“默认”DLQ 中消费,因为我不知道 ActiveMQ 可能会在那里转储哪些与我的应用程序代码完全无关的内部事物。所以我认为最好让我的虚拟暂存队列拥有自己的自定义 DLQ。我只见过one page of ActiveMQ documentation which discusses DLQ config,它只处理独立 ActiveMQ 安装的 XML 配置文件(不是嵌入在应用程序中的内存中代理)。
是否可以在运行时为嵌入式 ActiveMQ 实例中的队列以编程方式配置自定义 DLQ?
如果您认为我走错了路,我也很想听听其他建议。我对 JMS 比对 AMQP 更熟悉,所以我不知道使用 Qpid 或其他一些可嵌入 Java 的 AMQP 代理是否更容易。无论 Apache Camel 实际上是什么(!),我相信它应该在这类事情上表现出色,但是对于这个用例来说,学习曲线可能是过大的。
【问题讨论】:
-
+1。优秀的问题写得很好。并不是每天都会看到这样的问题。
标签: java multithreading jms apache-camel activemq