2010-12-14 72 views
1

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

我打算设计这种生产者消费者的工作方式。与生产者线程一样,为新消息轮询数据库并将其放入队列和工作线程中读取这些消息和进程。

起初,它看起来像JMS是这个要求的正确解决方案。但是我正在寻找是否有更好的选择,比如ExecutorService,在给定以下情况下使用适合此要求的Threadpool。

  1. 如果一个消息传递失败,我将不得不多次重试它至少24小时。
  2. 如果一个消息传递失败的客户,其他消息传递也将失败的所有机会。所以,我应该在处理该客户的下一条消息之前尝试发送第一条消息。

这意味着如果我有一个所有客户的消息队列,那么如果一个消息失败,其他人将不会被处理。

有人能给我一个关于如何最好地处理这个问题的建议吗?

在此先感谢。

回答

1

你应该认真对待Apache Camel。它处理所有线程,通过大量内置组件(SQL,JMS,SMTP,HTTP,文件等)为您生成&,并且围绕消费者/生产者的术语与集成的Camel视图相匹配。

实现的东西像你描述的一样简单:

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

看一看在list of endpoints

+0

好的建议。但考虑到时间的限制,我更关注Java Thread/JMS中的其他解决方案。 – Chandra 2010-12-14 02:58:50

0

重试逻辑是比较容易与普通的JMS实现:没有交易,分配消息的重试属性,每次重试时增加一次,重试时在监听器中暂停,限制耗尽后退出。

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

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