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(顺便说一句,包括 Binding
m),但您根本不必调用 rabbitAdmin.declare
。至少不是从 bean 定义阶段。
我正在使用 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(顺便说一句,包括 Binding
m),但您根本不必调用 rabbitAdmin.declare
。至少不是从 bean 定义阶段。