Java / JMS - 处理具有处理故障情形的消息数

时间:2010-12-14 00:02:53

标签: java multithreading jms executorservice

我有一个要求,我必须处理多少条消息。这些消息将由另一个进程插入到数据库表中。我所要做的就是检查数据库中的新消息,并根据其配置将其发送给相应的客户电子邮件或http。在任何给定时间,消息的数量可能是几千个,客户数量大约为1000个。

我计划按生产者消费者的方式设计。就像生产者线程轮询数据库中的新消息并将它们放入队列,工作线程读取这些消息和进程。

起初,看起来JMS是满足此要求的正确解决方案。但是我正在寻求更好的选择,比如ExecutorService,使用适合此要求的Threadpool给出以下场景。

  1. 如果一条消息传递失败,我将至少在24小时内重试几次。
  2. 如果客户的一条消息传递失败,则其他消息传递的所有可能性也将失败。因此,在处理该客户的下一条消息之前,我应该尝试发送第一条消息。
  3. 这意味着如果我为所有客户的所有消息都有一个队列,那么如果一条消息失败,则其他消息将不会被处理。

    有人可以给我一些关于如何最好地处理这件事的建议吗?

    提前致谢。

2 个答案:

答案 0 :(得分:1)

你应该认真看看Apache Camel。它处理所有线程,生产和销售。使用大量内置组件(SQL,JMS,SMTP,HTTP,文件等)为您消费,而围绕消费者/生产者的术语与Camel集成视图相匹配。

实现像你描述的那样简单:

from("sql:select * from table")
  .to("jms:myQueue");

查看list of endpoints

答案 1 :(得分:0)

使用通用JMS实现重试逻辑相对容易:没有事务,为消息分配重试属性,在每次重试时递增,在重试时暂停监听,在限制耗尽后退出。

每个客户的队列是最简单的配置。动态队列可以帮助您与客户:动态地为每个客户创建一个队列和一个监听器。

实际上可靠地轮询数据库可能会给您带来更多挑战。