我如何在另一个线程上确认 JMS 消息并请求重新传递未确认的消息?

How can I acknowledge a JMS message on another thread and request for redelivery of unacknowledged messages?

第 1 步:我需要通过一个线程接收消息。

第 2 步:由另一个线程处理并发送 ack 和重新传送请求(抛出异常)。

示例代码:

List<Message> list=new ArrayList();

@JmsListener(destination = "${jms.queue-name}", concurrency = "${jms.max-thread-count}")
public void receiveMessage(Message message) throws JMSException,UnsupportedEncodingException {
   list.add(message)
}
  
void run() {
   foreach(Message message:list) {
      //need to send ack or throw exception for redeliver if error
   }
}

现在另一个线程将启动并处理包含数据的列表,那么我如何发送确认或抛出重新传递的异常?

通常您会让您的框架(例如 Spring)处理并发消息处理。事实上,这是此类框架的好处之一。我没有看到将所有消息转储到 List 中然后手动生成线程来处理它有任何明显的好处。 Spring 已经 通过 @JmsListener 在线程中调用 receiveMessage 并提供可配置的并发性来为您执行此操作。

此外,如果您想触发重新交付,则需要使用事务处理的 JMS 会话并调用 rollback(),但 JMS 会话不是 线程安全的,因此您'你必须以某种方式控制对它的访问。这几乎肯定会使您的代码变得不必要的复杂。