我正在使用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);
}
}
答案 0 :(得分:0)
这是对的。您尝试手动注册Broker实体:
rabbitAdmin.declareExchange(exch);
...
rabbitAdmin.declareQueue(queue);
rabbitAdmin.declareBinding(BindingBuilder.bind(queue).to(exchange));
您应该依赖Framework中的内置自动声明机制。
换句话说:你最好宣告那些bean(包括Binding
BTW),但你根本不需要调用rabbitAdmin.declare
。至少不是来自bean定义阶段。