Spring-rabbitmq - 即使在连接不足的情况下启动spring-boot服务器

时间:2017-07-10 18:12:02

标签: java spring-boot spring-amqp spring-rabbitmq

我正在使用RabbitMQ的春季启动。一切正常 - 处理消息有效,失去连接后会自动尝试重新连接。但是,

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

@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(对我来说很重要)。我编辑了上面的代码。

而且,我完全不明白你的答案。你可以更确切地说吗? 为了确保我足够清楚:我想利用自动重新连接(现在它正在工作)。此外,如果在启动春季启动时服务器兔子代理关闭,它应该启动并循环尝试重新连接(此时应用程序无法启动)。

Edit2

  @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);
        }    

     }

1 个答案:

答案 0 :(得分:0)

这是对的。您尝试手动注册Broker实体:

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

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

换句话说:你最好宣告那些bean(包括Binding BTW),但你根本不需要调用rabbitAdmin.declare。至少不是来自bean定义阶段。