4

1) サーバーがクライアントにメッセージを送信します。

2) インバウンドチャネルアダプターは、コンシューマーからの「MANUAL」承認モード操作を待機するように構成されています

3)「TaskBundlereceiver」ビーンは「ChannelAwareMessageListener」を実装しており、実装メソッドではメッセージ確認を行っています。

「TaskBundlereceiver」が実行されていません。何か不足していますか?

以下は、私が説明した手順の構成の詳細です。

あなたの意見に感謝します。

    @Override
    public void onMessage(org.springframework.amqp.core.Message message, Channel channel) throws Exception 
    {
        logger.debug("In onMessage method of the channel aware listener. message =["+message.getBody().toString()+"]");
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);
    }

XML 構成:

    <!-- Channel that receives the task bundle from the server for execution -->
    <int:channel id="fromKServerChannel"/>

    <int-amqp:inbound-channel-adapter id="taskBundleReceiverAdapter"
                                      channel="fromKServerChannel"
                                      error-channel="taskBundleErrorChannel"
                                      acknowledge-mode="MANUAL"
                                      expose-listener-channel="true"
                                      queue-names="kanga_task_queue"
                                      connection-factory="connectionFactory"
                                      concurrent-consumers="20"/>

    <int:chain input-channel="fromKServerChannel" output-channel="nullChannel">
        <int:service-activator ref="taskBundleReceiver" method="onMessage"/>
        <int:service-activator ref="taskBundleExecutor" method="executeBundle"/>
    </int:chain>
4

1 に答える 1

6

そのようには機能しません。リスナーはアダプターであり、サービスアクティベーターを介して呼び出されるサービスではありません。アダプターは現在、手動 ack のためにチャネルをクライアントに渡すことをサポートしていません。トランザクションを使用する場合は、expose-listener-channel 属性を使用するため、ダウンスタックのウサギ テンプレートをトランザクションに参加させることができます。

なぜマニュアル ack が必要なのですか? AUTO (デフォルト) は、スレッドが正常に戻ったときにコンテナーによって ack が自動的に行われることを意味します。サービスが例外をスローすると、メッセージは破棄されます。

それで、それがackを制御する方法です。

MANUAL ack を本当に使用したい場合は、 a を使用し<rabbit:listener-container/>て taskBundleReceiver を直接呼び出す必要があります。その後、メッセージング ゲートウェイを使用してエグゼキュータにメッセージを送信できます。

于 2012-10-31T19:50:52.547 に答える