首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RabbitAdmin -热切宣言

RabbitAdmin -热切宣言
EN

Stack Overflow用户
提问于 2015-03-06 09:19:05
回答 2查看 5.7K关注 0票数 3

我正在使用Spring来设置不同服务之间的远程处理,正如所描述的这里。但是,当我在配置上设置一个reply-timeout时,第一个请求总是失败的,因为声明队列、交换和绑定所花费的时间超过了超时时间:

RabbitAdmin组件可以在启动时声明交换、队列和绑定。它通过ConnectionListener懒洋洋地这样做,所以如果代理在启动时不存在,那就无关紧要了。第一次使用连接时(例如,通过发送消息),侦听器将触发并应用管理功能。

是否有任何方法可以在启动时急切地声明,而不是在第一个发布事件上进行,以防止第一个请求总是失败?

EN

回答 2

Stack Overflow用户

发布于 2017-02-22 11:17:14

如果使用注释声明队列:

代码语言:javascript
复制
@Configuration
public class QueuesConfiguration {

    @Bean
    public FanoutExchange exchange() {
        return new FanoutExchange("exchange", true, false);
    }

    @Bean
    public Binding binding() {
        return BindingBuilder.bind(queue()).to(exchange());
    }

    @Bean
    public Queue queue() {
        return new Queue("queue");
    }

    @Bean
    public RabbitAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
        return new RabbitAdmin(connectionFactory);
    }
}

然后在应用程序启动时手动调用RabbitAdmin.initialize()

代码语言:javascript
复制
@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    private RabbitAdmin rabbitAdmin;

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event) {

        rabbitAdmin.initialize();
    }
}
票数 7
EN

Stack Overflow用户

发布于 2015-03-06 09:42:32

正如我们从这个描述和来自RabbitAdmin的代码中看到的,最后一个只是将ConnectionListener填充到提供的ConnectionFactory

ConnectionListener.onCreate是从ConnectionFactory.createConnection()调用的。

因此,您可以处理,例如,ContextRefreshedEvent,只需急切地做空connectionFactory.createConnection()

另一方面,RabbitAdmin也有initialize()公共方法用于相同的目的。

更新

实际上,ListenerContainer在其start()上也是这样做的。您必须在有侦听器的应用程序中声明队列、交换和绑定,并使其成为autoStartup = true。老实说,侦听器应用程序负责真正的代理实体。

sending应用程序应该只与exchangeNameroutingKey进行交易。

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

https://stackoverflow.com/questions/28895625

复制
相关文章

相似问题

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