Java/JMS—处理失败场景的消息数

Java/JMS—处理失败场景的消息数,java,multithreading,jms,executorservice,Java,Multithreading,Jms,Executorservice,我有一个要求,我必须处理的邮件数量。这些消息将由另一个进程插入到DB表中。我所要做的就是检查数据库中的新消息,并根据相应客户的配置将其发送到相应客户的电子邮件或http。在任何给定的时间,消息的数量可能是几千条,而客户的数量大约是1000条 我计划以生产者-消费者的工作方式来设计它。与生产者线程一样,生产者线程轮询数据库以获取新消息,并将它们放入队列,工作线程读取这些消息和进程 起初,JMS似乎是满足这一需求的正确解决方案。但我正在寻找更好的替代方案,如ExecutorService,在以下场景

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

我计划以生产者-消费者的工作方式来设计它。与生产者线程一样,生产者线程轮询数据库以获取新消息,并将它们放入队列,工作线程读取这些消息和进程

起初,JMS似乎是满足这一需求的正确解决方案。但我正在寻找更好的替代方案,如ExecutorService,在以下场景中使用适合此要求的Threadpool

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

    有人能给我一些建议,告诉我如何最好地处理这个问题吗


    提前谢谢。

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

    实现您所描述的内容非常简单:

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

    看一看

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

    实现您所描述的内容非常简单:

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

    请看一下,使用通用JMS相对容易实现的重试逻辑:无事务、为消息分配重试属性、每次重试时递增、重试时暂停在侦听器中、限制用尽后退出

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


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

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

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


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

    好建议。但是考虑到时间限制,我更多地关注Java Thread/JMS中的其他解决方案。但考虑到时间限制,我更多地关注Java线程/JMS中的其他解决方案。