我们的应用程序在 WebLogic 12c 中运行,正在从队列系统中检索消息,我们从中检索消息的队列被配置为 FIFO。我们使用 Spring 来配置检索功能,并且容器 (org.springframework.jms.listener.DefaultMessageListenerContainer) 和消息侦听器 (org.springframework.jms.core.support.JmsGatewaySupport) 都是单例的。此外,该容器默认配置了一个 WorkManager 作为任务执行器。为了保证消息按照预期的顺序(它们发送到队列的顺序)进行处理,我们在监听器中使用了 ReentrantLock,我们期望消息被一一检索和处理。监听器代码如下:
public class JmsReceiveAdapterImpl extends JmsGatewaySupport implements SessionAwareMessageListener {
private final ReentrantLock lock = new ReentrantLock(true);
[...]
public void onMessage(Message rcvMessage, Session session) throws JMSException {
lock.lock();
logger.warn("Lock has been acquired by thread: " + Thread.currentThread().getId());
try {
[...]
} finally {
logger.warn("Lock is going to be released by thread: " + Thread.currentThread().getId());
lock.unlock();
}
}
}
即使两条消息以正确的顺序放置在队列中,并且按该顺序被消费(回想一下队列是一个 FIFO 队列),但不知何故,这两条消息由应用程序并行处理,如下所示日志块:
锁已被线程获取:28 退出计数:1 从 XXX 收到的消息 1 / 1 收到消息 ID1。 锁已被线程获取:54 退出计数:1 从 XXX 收到消息 ID2 收到的消息 1 / 1。 ***** 错误 ***** 锁将被线程释放:54 锁将被线程释放:28
为什么我们会获得这种行为?任何想法?
非常感谢您。