【问题标题】:ActiveMQ - worker threads and pool of tasksActiveMQ - 工作线程和任务池
【发布时间】:2025-12-05 13:20:22
【问题描述】:

我有以下场景:

  • 调用了一些操作,结果创建了多个任务(数千个)
  • 它们(它们的状态和详细信息)存储在数据库表中
  • 我需要以某种方式在多个节点上执行这些任务

因此,显而易见的方法是为每个创建的任务(10000 个任务 - 10000 条消息)发送一条 JMS 消息,然后由一个消费者池(每个节点)执行它们 - 但这看起来有点矫枉过正 - 监听器需要无论如何从数据库中获取任务,通知它应该执行下一个任务就足够了,就好像 - 发送一条消息(“工作下一个任务”)并以某种方式将其设置为传递 10000 次。

如何解决这个问题?发送 10000 条消息真的是最好的主意吗?

另外,ActiveMQ 有这个消息调度的东西 [1] - 也许只是将周期设置为 0 并重复到 10000?那会正常工作吗?除了上面提到的还有没有更好的方法?

[1]http://activemq.apache.org/delay-and-schedule-message-delivery.html

【问题讨论】:

    标签: jms activemq worker


    【解决方案1】:

    实际上,您可以使用 Redis 来存储已完成任务的 id (1..n)。并使用“set”数据结构。

    键看起来像任务列表:

    每个键将包含已完成任务的 ID。

    因此,当您开始一项包含 1000 个异步任务的工作时。您为此作业生成一些唯一 ID,并使用任务 ID 发送,当任务完成时,工作人员(处理此任务的人员)应在 DB(Redis)中添加此 ID。并且当最后一个工作人员在数据库中保存 id 并且设置的任务大小相等时(您应该在每个任务之后检查它)——所有任务都完成了,这样您就可以发送另一条消息或进行其他任何操作。

    Redis 提供非常快速的访问和非常快速的少数数据结构。

    【讨论】: