2

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

なぜこの動作が得られるのでしょうか? 何か案が?

よろしくお願いします。

4

1 に答える 1