有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java RabbitAdmin声明

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

The RabbitAdmin component can declare exchanges, queues and bindings on startup. It does this lazily, through a ConnectionListener, so if the broker is not present on startup it doesn't matter. The first time a Connection is used (e.g. by sending a message) the listener will fire and the admin features will be applied.

有没有什么方法可以在启动时立即声明,而不是在第一次发布事件时声明,以防止第一个请求总是失败


共 (2) 个答案

  1. # 1 楼答案

    如果使用注释声明队列:

    @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();
        }
    }
    
  2. # 2 楼答案

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

    ConnectionFactory.createConnection()调用ConnectionListener.onCreate

    例如,你可以处理ContextRefreshedEvent,然后急切地执行void connectionFactory.createConnection()

    从另一方面来看RabbitAdmininitialize()公共方法用于相同的目的

    更新

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

    sending应用程序应该只与exchangeNameroutingKey打交道