Как подтвердить сообщение через программу с использованием интеграции Spring AMQP / Spring

1) Сервер отправляет сообщение клиенту.

2) Адаптер входящего канала настроен на ожидание работы режима подтверждения "РУЧНОЙ" от потребителя.

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>

person Vijay Srinivasaraghavan    schedule 31.10.2012    source источник


Ответы (1)


Так не работает; слушатель - это адаптер, а не служба, вызываемая через активатор службы. В настоящее время адаптер не поддерживает передачу канала клиенту для ручных подтверждений. Атрибут expose-listener-channel используется при использовании транзакций, поэтому шаблон кролика с нижним стеком может участвовать в транзакции.

Почему вам нужны ручные подтверждения? AUTO (по умолчанию) означает, что подтверждение будет выполнено контейнером автоматически, когда поток вернется в нормальное состояние; если ваша служба выдает исключение, сообщение будет заблокировано.

Итак, как управлять подтверждением.

Если вы действительно хотите использовать ручные подтверждения, вам придется использовать <rabbit:listener-container/> для прямого вызова taskBundleReceiver. Затем он может отправить сообщение исполнителю, используя шлюз обмена сообщениями.

person Gary Russell    schedule 31.10.2012
comment
Спасибо, Гэри. Я выполняю некоторые операции с сообщением в отдельном потоке и в зависимости от успеха / неудачи обработки я хочу соответственно подтвердить сообщение. Адаптер входящего канала направляет входящее сообщение в канал сообщений отKServerChannel. Вы предлагаете вызвать класс реализации ChannelAwareMessageListener непосредственно из службы, которая была вызвана из fromKServerChannel? Я смущен (очевидно) и ценю ваш вклад. - person Vijay Srinivasaraghavan; 01.11.2012
comment
Нет; адаптер входящего канала - это MessageListener, который принимает вызовы onMessage () из контейнера. Он не поддерживает ChannelAwareMessagelistener. Самое простое решение - выбросить исключение, если вы хотите, чтобы сообщение было отклонено, или вернуть его в обычном режиме для подтверждения. Если вы действительно хотите вызвать ChannelAwareMessageListener, вы должны сделать это самостоятельно; получать сообщения непосредственно от ‹rabbit: listener-container /›, а не от адаптера входящего канала SI. В большинстве случаев нет необходимости предоставлять AMQP коду пользователя. - person Gary Russell; 01.11.2012
comment
Ваш класс может быть просто POJO, не зная, что он вызывается из Spring Integration или AMQP. - person Gary Russell; 01.11.2012