Spring-rabbitmq - 启动 spring-即使在没有连接的情况下启动服务器

Spring-rabbitmq - start spring-boot server even in case of lack of connection

我正在使用 spring 启动 RabbitMQ。一切正常 - 处理消息有效,并且在失去连接后它会自动尝试重新连接。然而,

我只有一个问题:
当 Rabbit 服务器关闭时(不可能建立连接)并且我尝试启动 spring-boot 服务器它无法启动。我现在无法检查(无法访问机器)异常的确切内容是什么,但这是关于 bean 实例化的问题。你能帮帮我吗?

@Configuration
public class RabbitConfig{
       private String queueName = "myQueue";
       private String echangeName = "myExchange";

      @Bean
        public FanoutExchange exchange(RabbitAdmin rabbitAdmin)   {
            FanoutExchange exch = new 
             FanoutExchange(echangeName);
            rabbitAdmin.declareExchange(exch);
            return exch;
        }

        @Bean
        public Queue queue(FanoutExchange exchange, RabbitAdmin rabbitAdmin) {
        HashMap<String, Object> args = new HashMap<String, Object>();
        args.put("x-message-ttl", 20);
        args.put("x-dead-letter-exchange", "dlx_exchange_name");

            Queue queue = new Queue(queueName, true, false, false, args);
            rabbitAdmin.declareQueue(queue);
            rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
            return queue;
        }

 }

编辑
我必须编辑,因为我不知道这里很重要的事实。 在我的例子中,最后一个参数不是 null,它是一些 Hashmap(这对我很重要)。我在上面编辑了我的代码。

另外,我不是很理解你的回答。你能说得更准确些吗?
为了确保我足够清楚:我想利用自动重新连接(现在它正在工作)。此外,如果 在启动期间 spring boot server rabbit broker 关闭 它应该启动并循环尝试重新连接(此时应用程序不会启动)。

编辑2

  @Configuration
    public class RabbitConfig{
           private String queueName = "myQueue";
           private String echangeName = "myExchange";

          @Bean
            public FanoutExchange exchange(RabbitAdmin rabbitAdmin)   {
                FanoutExchange exch = new 
                 FanoutExchange(echangeName);
                //rabbitAdmin.declareExchange(exch);
                return exch;
            }

            @Bean
            public Queue queue(FanoutExchange exchange, RabbitAdmin rabbitAdmin) {
            HashMap<String, Object> args = new HashMap<String, Object>();
            args.put("x-message-ttl", 20);
            args.put("x-dead-letter-exchange", "dlx_exchange_name");

                Queue queue = new Queue(queueName, true, false, false, args);
                //rabbitAdmin.declareQueue(queue);
                //rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
                return queue;
            }
         // EDIT 3: now, we are made to create binding bean

        @Autowired
        Queue queue; // inject bean by name
        @Autowired
        Exchange exchange;

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

     }

没错。您尝试手动注册 Broker 实体:

rabbitAdmin.declareExchange(exch);
...
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));

你应该依赖 Framework 中内置的自动声明机制。

换句话说:您可以声明那些 bean(顺便说一句,包括 Bindingm),但您根本不必调用 rabbitAdmin.declare。至少不是从 bean 定义阶段。