我对 ActiveMQ scheduler plugin 做了一些工作。这简化了在低音量下延迟传送的消息调度,但是当我进入 100ks 消息时,系统在两个关键方面出现故障。
现有的调度程序感觉有点僵硬,并没有按预期执行。所以,重新思考我想要一个 jobs
和 jobs-scheduled
队列的问题。发送到 jobs-scheduled
队列的消息将有一个 ttl
标头,其中包含应该传送的 Unix 时间戳。一个进程将在 cron 作业上运行,该作业将从 jobs-scheduled
队列中获取消息并使用选择器将其发送到 jobs
队列,以仅挑选出经过 ttl convert_string_expressions:ttl < %(now)s
的消息。
我的两个问题是:
答案 0 :(得分:1)
ActiveMQ 是一个消息代理,而不是一个作业调度程序,因此您尝试做的实际上超出了代理的意图范围。是的,ActiveMQ 确实具有预定消息功能,但这不适用于大规模作业队列类型的工作,它是提供一些最小延迟交付的简单功能。
您正在寻找的听起来更像是 Quartz 或其他一些批处理作业调度库。您可以为 ActiveMQ 开发自己的作业调度程序实现或在插件中执行某些操作,但您实际上是在尝试违背代理的意图,即以解耦方式尽快传递消息。
答案 1 :(得分:-1)
旁注 - 可能偏离主题。
过去我不得不解决一个类似的情况,在这种情况下,提前将消息加载到队列中以减少总传输时间很有意义。
我通过使用 Camel 路由和侧信道激活解决了这个问题。 Camel 允许您以编程方式启动和停止路由,因此您可以在给定时间段内加载没有消费者的队列。然后使用专用队列进行控制,您发送“开始”消息。控制路由接收到“开始”消息,然后激活主数据处理路由。然后,您需要配置某种“停止”消息语义,以便为下一次运行做好准备。
实际上,您可以通过更多地控制调度并减少数据到队列加载时间问题来获得延迟行为模式。您还可以通过跨多个队列加载数据来解决扩展问题。