ActiveMQ - 工作线程和任务池

时间:2013-02-06 02:34:01

标签: jms activemq worker

我有以下情况:

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

因此,显而易见的方法是为每个创建的任务发送JMS消息(10000个任务 - 10000个消息),并且消费者的池(每个节点)将执行它们 - 但这看起来像是一种矫枉过正 - 听众需要无论如何从DB获取任务,只需通知它它应该可以工作下一个任务,就像 - 发送一条消息(“工作下一个任务”)并以某种方式将其设置为交付10000次一样。

如何处理?发送10000条消息真的是最好的主意吗?

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

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

1 个答案:

答案 0 :(得分:0)

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

键看起来像任务列表:

每个密钥都包含已完成任务的ID。

所以,当你开始一些有1000个异步任务的工作时。您为此作业生成一些唯一ID,并使用任务ID发送,当任务完成时,worker(处理此任务的人)应在DB(Redis)中添加此ID。当最后一个工作人员在DB中保存id并设置相同大小的任务(你应该在每个任务之后检查它) - 所有任务都已完成,这样你就可以发送另一条消息或者做任何其他事情。

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