首页 文章

Spring AMQP发布者在amqp出站网关中确认

提问于
浏览
1

我正在使用spring amqp使用出站网关将我的消息发布到RabbitMQ . 我在连接工厂上设置了发布者确认,并添加了我的自定义回调侦听器 .

问题是我的CorrelationData始终为null,我无法在出站网关上添加任何关联数据 . 这仅适用于出站通道适配器 .

对于出站网关,发布者确认甚至可以工作吗?

编辑我的配置如下 . 我查看了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");
        }
    }
}

这个

1 回答

  • 1

    不幸的是,我看不到网关的简单解决方法;底层 RabbitTemplate 仅支持在 send() 方法上添加相关数据,而不支持 sendAndReceive 方法 .

    我能想到的两个选项是(1)使用一对出站和入站适配器(而不是网关),但在这种情况下你必须做自己的请求/回复关联 .

    或者(2),使用 RabbitTemplate.execute() 并在 doInRabbit 回调中,添加类似于 RabbitTempalate.doSendAndReceive 中的代码,同时设置相关数据,如 doSend() 中所述 .

    我打开了JIRA Issue .

相关问题