У меня есть веб-приложение, которое публикует сообщения на RabbitQueue с помощью spring. Я включил подтверждение издателя и включил возврат, и я использую шаблон spring rabbit: template. Это моя конфигурация:
<rabbit:template id="amqpTemplate" connection-factory="amqpConnectionFactory" retry-template="retryTemplate" confirm-callback="messagesConfirmCallback" return-callback="messagesReturnCallback"
exchange="${rabbitmq.rest.exchange}" routing-key="key.listener" mandatory="true" />
<rabbit:connection-factory id="amqpConnectionFactory" publisher-confirms="true" publisher-returns="true" connection-factory="secureClientConnectionFactory" />
<bean id="messagesConfirmCallback" class="com.test.message.MessagesConfirmCallback" />
<bean id="messagesReturnCallback" class="com.test.message..MessagesReturnCallback" />
<bean id="secureClientConnectionFactory" class="org.springframework.amqp.rabbit.connection.RabbitConnectionFactoryBean" >
<property name="uri" value="${mq.uri}" />
</bean>
Класс My MessagesConfirmCallback:
public class MessagesConfirmCallback implements RabbitTemplate.ConfirmCallback {
private static final Log LOGGER = LogFactory.getLog(MessagesConfirmCallback.class);
@Override
public void confirm(CorrelationData correlationData, boolean ack,
String cause) {
if(ack){
LOGGER.info("ACK received");
}
else{
LOGGER.info("NACK received");
}
}
}
и класс MessageReturnCallback:
public class MessageReturnCallback implements RabbitTemplate.ReturnCallback {
private static final Log LOGGER = LogFactory.getLog(MessagesReturnCallback.class);
@Override
public void returnedMessage(Message message, int replyCode,
String replyText, String exchange, String routingKey) {
LOGGER.info("Message: " + message.getBody());
}
}
Я могу видеть, что MessageReturnCallback.returnedMessage вызывается (и там просматривается опубликованная полезная нагрузка) в тех случаях, когда публикация успешна и получен ACK, но не в случае NACK. Есть ли способ получить опубликованное сообщение в случае NACK?