gpt4 book ai didi

java - Spring-rabbitmq - 即使在缺乏连接的情况下也启动 spring-boot 服务器

转载 作者:行者123 更新时间:2023-12-03 03:05:49 25 4
gpt4 key购买 nike

我正在将 Spring Boot 与 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;
}

}

编辑
我必须编辑,因为我不知道这在这里很重要。就我而言,最后一个参数不为空,它是一些 HashMap (这对我来说很重要)。我在上面编辑了我的代码。

此外,我不太明白你的回答。能说得更准确一点吗?
为了确保我足够清楚:我想利用自动重新连接(现在它正在工作)。此外,如果在启动 Spring Boot 服务器 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);
}

}

最佳答案

这是正确的。您尝试手动注册代理实体:

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

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

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

关于java - Spring-rabbitmq - 即使在缺乏连接的情况下也启动 spring-boot 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45019022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com