我如何在另一个线程上确认 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 会话不是 线程安全的,因此您'你必须以某种方式控制对它的访问。这几乎肯定会使您的代码变得不必要的复杂。
第 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 会话不是 线程安全的,因此您'你必须以某种方式控制对它的访问。这几乎肯定会使您的代码变得不必要的复杂。