具有异步侦听器的JMS事务性消息处理模式

时间:2016-11-03 09:12:40

标签: design-patterns jms activemq transactional

我将简短描述我们的系统基础架构和消息流:

  1. 有多个生产者将消息排入QUEUE

  2. 有一个异步侦听器(AUTO_ACKNOWLEDGE)收集消息并将它们放在列表中。

  3. 简化代码:

    private List<Message> messages;
    public void onMessage(Message message) {
          messages.add(messages)
    }
    
    1. 有一个轮询器唤醒每个间隔,抓取所有到目前为止出列的消息并处理它们。
    2. 简化代码(来自听众):

         public List<Message> retrieveAndClearMessages() {
            synchronized (messages) {
               List<Message> returnList = new ArrayList<Message>(messages);
               messages.clear();
               return returnList;
            }
         }
      

      问题在于,轮询器的持续时间是内存 - 这意味着如果遇到中断,所有当前进程的消息都将丢失。是否有任何企业模式可以解决这些问题?也许是一些备份队列或其他解决方法。

1 个答案:

答案 0 :(得分:0)

对我来说最好的解决方案是当轮询器唤醒时,它连接到QUEUE,收集和处理消息,如果你的消息被保留,那么就没有任何风险可以丢失它们。