WebLogic 12c で実行されているアプリケーションは、メッセージを取得するキューが FIFO として構成されているキューイング システムからメッセージを取得しています。Spring を使用して取得機能を構成しており、コンテナー (org.springframework.jms.listener.DefaultMessageListenerContainer) とメッセージ リスナー (org.springframework.jms.core.support.JmsGatewaySupport) の両方がシングルトンです。さらに、そのコンテナーはデフォルトで WorkManager をタスク実行者として構成しています。メッセージが期待される順序 (キューに送信される順序) で処理されることを保証するために、リスナーで ReentrantLock を使用し、メッセージが 1 つずつ取得されて処理されることを期待していました。リスナーのコードは次のとおりです。
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();
}
}
}
2 つのメッセージが正しい順序でキューに配置され、その順序で消費されますが (キューは FIFO であることを思い出してください)、次の図に示すように、アプリケーションによって 2 つのメッセージが並列に処理されます。ログチャンク:
スレッドによってロックが取得されました: 28 バックアウト数: 1 メッセージ 1 / 1 を XXX から受信しました メッセージ ID1 を受信しました。 スレッドによってロックが取得されました: 54 バックアウト数: 1 メッセージ 1 / 1 を XXX から受信しました メッセージ ID2 を受信しました。 ***** エラー ***** スレッドによってロックが解放されます: 54 スレッドによって ロックが解放されます: 28
なぜこの動作が得られるのでしょうか? 何か案が?
よろしくお願いします。