我正在使用spring amqp使用出站网关向RabbitMQ发布消息。我在连接工厂上设置了发布者确认,并添加了我的自定义回调侦听器。
问题是我的CorrelationData始终为null,我无法在出站网关上添加任何关联数据。这仅适用于出站通道适配器。
对于出站网关,发布商确认甚至可以工作吗?
EDIT 我的配置如下。我查看了SI代码,是的,发布商确认,已启用。问题是当我收到NACK时我会怎么做? 由于出站网关我不需要相关ID来处理响应,因此已经有一个线程在响应的临时应答队列上进行侦听。
使用发布者确认出站网关的确切意义何在?如果没有响应或我的Rabbit节点出现故障,我将遇到异常。是否会出现丢失消息的情况?
<rabbit:connection-factory id="rabbitConnectionFactory"
host="someip" port="5672"
username="username"
password="password"
virtual-host="vhost"
publisher-confirms="true"/>
<rabbit:admin connection-factory="rabbitConnectionFactory"/>
<rabbit:template id="amqpTemplate" connection-factory="rabbitConnectionFactory"
confirm-callback="messagesConfirmCallback"/>
<int-amqp:outbound-gateway
request-channel="channel"
amqp-template="amqpTemplate"
exchange-name="exchange"
routing-key-expression="headers['queueSpecific']+'.queue'">
<amqp:request-handler-advice-chain>
<ref bean="retryAdvice"/>
</amqp:request-handler-advice-chain>
</int-amqp:outbound-gateway>
我的回调也很简单
@Component
public class MessagesConfirmCallback implements RabbitTemplate.ConfirmCallback {
private final static Logger LOGGER = LoggerFactory.getLogger(MessagesConfirmCallback.class);
@Override
public void confirm(CorrelationData correlationData, boolean ack) {
if(ack){
LOGGER.info("ACK received");
}
else{
LOGGER.info("NACK received");
}
}
}
这个
答案 0 :(得分:1)
不幸的是,我没有看到一个简单的网关工作;基础RabbitTemplate
仅支持在send()
方法上添加相关数据,而不是sendAndReceive
方法。
我能想到的两个选项是(1)使用一对出站和入站适配器(而不是网关),但在这种情况下你必须做自己的请求/回复关联。 / p>
或者(2),使用RabbitTemplate.execute()
并在doInRabbit
回调中添加类似于RabbitTempalate.doSendAndReceive
中的代码,同时设置相关数据,如{{1}中所做的那样}}
我打开了JIRA Issue。