首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring AMQP publisher在amqp出站网关中确认

Spring AMQP publisher在amqp出站网关中确认
EN

Stack Overflow用户
提问于 2014-12-16 21:49:45
回答 1查看 1.3K关注 0票数 1

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

问题是我的CorrelationData总是空的,并且我不能在出站网关上添加任何相关数据。这仅适用于出站通道适配器。

对于出站网关,publisher确认还能工作吗?

编辑我的配置如下。我查看了SI代码,是的,出版商确认,是启用的。问题是当我收到一个NACK时我该怎么做?因为出站网关我不需要相关id来处理响应,所以已经有一个线程在监听响应的临时回复队列。

使用带有出站网关的publisher确认到底有什么意义?如果没有响应,或者我的Rabbit节点宕机,我会遇到异常。是否存在丢失消息的情况?

代码语言:javascript
复制
<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"/>

代码语言:javascript
复制
 <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>

而且我的回调也很简单

代码语言:javascript
复制
@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");
        }
    }
}

EN

回答 1

Stack Overflow用户

发布于 2014-12-17 00:11:27

不幸的是,我没有看到网关的简单解决方案;底层RabbitTemplate只支持在send()方法上添加关联数据,而不支持在sendAndReceive方法上添加关联数据。

我能想到的两种选择是(1)使用一对出站和入站适配器(而不是网关),但在这种情况下,您必须进行自己的请求/应答关联。

或者(2),使用RabbitTemplate.execute()并在doInRabbit回调中添加类似于RabbitTempalate.doSendAndReceive中的代码,同时像在doSend()中一样设置关联数据。

我打开了一个JIRA Issue

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27506136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档