我正在使用Spring来设置不同服务之间的远程处理,正如所描述的这里。但是,当我在配置上设置一个reply-timeout时,第一个请求总是失败的,因为声明队列、交换和绑定所花费的时间超过了超时时间:
RabbitAdmin组件可以在启动时声明交换、队列和绑定。它通过ConnectionListener懒洋洋地这样做,所以如果代理在启动时不存在,那就无关紧要了。第一次使用连接时(例如,通过发送消息),侦听器将触发并应用管理功能。
是否有任何方法可以在启动时急切地声明,而不是在第一个发布事件上进行,以防止第一个请求总是失败?
发布于 2017-02-22 11:17:14
如果使用注释声明队列:
@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():
@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {
@Autowired
private RabbitAdmin rabbitAdmin;
@Override
public void onApplicationEvent(final ApplicationReadyEvent event) {
rabbitAdmin.initialize();
}
}发布于 2015-03-06 09:42:32
正如我们从这个描述和来自RabbitAdmin的代码中看到的,最后一个只是将ConnectionListener填充到提供的ConnectionFactory。
ConnectionListener.onCreate是从ConnectionFactory.createConnection()调用的。
因此,您可以处理,例如,ContextRefreshedEvent,只需急切地做空connectionFactory.createConnection()。
另一方面,RabbitAdmin也有initialize()公共方法用于相同的目的。
更新
实际上,ListenerContainer在其start()上也是这样做的。您必须在有侦听器的应用程序中声明队列、交换和绑定,并使其成为autoStartup = true。老实说,侦听器应用程序负责真正的代理实体。
sending应用程序应该只与exchangeName和routingKey进行交易。
https://stackoverflow.com/questions/28895625
复制相似问题