微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring JMSTemplate在一个事务中接收所有消息

我试图使用Spring jmstemplate.receive(String)方法以同步模式从队列中获取所有消息.

问题是我总是只收到一条消息.这是代码

@Transactional
public Listjmstemplate.receive(destination)) != null) {
    messages.add(message);
  }
  return messages;
}

如果我删除了@Transactional注释,我会收到所有消息,但所有消息都是在事务中完成的,所以如果稍后在处理这些消息时会有一个例外,消息将会丢失.

这是我的jmstemplate bean的定义.

jmstemplate" class="org.springframework.jms.core.jmstemplate">
    

我想要实现的是拥有一个事务,并且在此事务中我想获取所有待处理的消息.

最佳答案
我会回复自己.看起来jmstemplate不支持它.暂时解决它的唯一方法是扩展jmstemplate添加使用jmstemplate部分的新方法.不幸的是,有些方法是私有的,所以需要复制它们……

public class CustomQueuejmstemplate extends jmstemplateDelegate {

  public ListetoLiveInMillis();
      }

      // START OF MODIFIED CODE
      ListNowledge(session)) {
        // Manually ackNowledge message,if any.
        for (Message retrievedMessages : messages) {
          retrievedMessages.ackNowledge();
        }
      }
      return messages;
    }
    finally {
      JmsUtils.closeMessageConsumer(consumer);
    }
  }

  private Message doReceive(MessageConsumer consumer,long timeout) throws JMSException {
    if (timeout == RECEIVE_TIMEOUT_NO_WAIT) {
      return consumer.receiveNowait();
    } else if (timeout > 0) {
      return consumer.receive(timeout);
    } else {
      return consumer.receive();
    }
  }

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐