1

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

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

起初看起来 JMS 是满足此要求的正确解决方案。但是我正在寻找是否有更好的选择,例如 ExecutorService,在以下情况下使用适合此要求的线程池。

  1. 如果一条消息传递失败,我将不得不重试几次,至少 24 小时。
  2. 如果客户的一条消息传递失败,那么其他消息传递也将失败。因此,在为该客户处理下一条消息之前,我应该尝试发送第一条消息。

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

有人可以就我如何最好地处理这个问题给我建议吗?

提前致谢。

4

2 回答 2

1

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

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

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

查看端点列表

于 2010-12-14T01:26:21.947 回答
0

使用通用 JMS 实现重试逻辑相对容易:无事务,为消息分配重试属性,每次重试时递增,重试时暂停侦听器,用完限制后退出。

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

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

于 2010-12-14T06:01:41.100 回答