Spring AMQP - RabbitMQ 连接未在应用程序启动时创建
Spring AMQP - RabbitMQ connection is not created on application startup
我有一个 Spring 引导应用程序,我的目标是在应用程序启动时声明队列、交换和绑定。应用程序将向各种队列生成消息,应用程序上没有消费者。
我已经在 pom.xml
中添加了这些依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.12.RELEASE</version>
</dependency>
我的配置class
@Configuration
public class RabbitConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("myhost", 5672);
connectionFactory.setUsername("example_name");
connectionFactory.setPassword("example_pass");
return connectionFactory;
}
@Bean
public AmqpAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
@Bean
public Queue declareQueue() {
return new Queue("test_queue", true, false, false);
}
@Bean
public DirectExchange declareDirectExchange() {
return new DirectExchange("test_direct_exchange", true, false);
}
@Bean
public Declarables declareBindings() {
return new Declarables(
new Binding("test_queue", DestinationType.QUEUE, "test_direct_exchange", "test_routing_key", null)
);
}
}
我的问题是队列、交换器和绑定不是在应用程序启动时创建的。 Spring开机连连接都不打开。仅当我向队列生成消息时才创建连接、队列等。
经过一些挖掘,我发现我缺少执行器依赖项。
所以添加这个依赖解决了我的问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
奇怪的是,除非执行器依赖项存在,否则在应用程序启动时连接不会打开。
如果你想在应用程序启动期间强制声明并且没有任何消费者,你可以将执行器启动器添加到类路径,或者直接自己创建共享连接。
@Bean
ApplicationRunner runner(ConnectionFactory cf) {
return args -> cf.createConnection().close();
}
这不会关闭连接;如果您想这样做,请致电 cf.resetConnection()
.
如果您希望应用程序在代理关闭时启动,请执行以下操作。
@Bean
ApplicationRunner runner(ConnectionFactory cf) {
return args -> {
boolean open = false;
while(!open) {
try {
cf.createConnection().close();
open = true;
}
catch (Exception e) {
Thread.sleep(5000);
}
}
};
}
您可以使用
@Component
public class QueueConfig {
private AmqpAdmin amqpAdmin;
public QueueConfig(AmqpAdmin amqpAdmin) {
this.amqpAdmin = amqpAdmin;
}
@PostConstruct
public void createQueues() {
amqpAdmin.declareQueue(new Queue("q1", true));
amqpAdmin.declareQueue(new Queue("q2", true));
}
}
我有一个 Spring 引导应用程序,我的目标是在应用程序启动时声明队列、交换和绑定。应用程序将向各种队列生成消息,应用程序上没有消费者。
我已经在 pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.amqp</groupId>
<artifactId>spring-rabbit</artifactId>
<version>2.2.12.RELEASE</version>
</dependency>
我的配置class
@Configuration
public class RabbitConfiguration {
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory("myhost", 5672);
connectionFactory.setUsername("example_name");
connectionFactory.setPassword("example_pass");
return connectionFactory;
}
@Bean
public AmqpAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
return new RabbitAdmin(connectionFactory);
}
@Bean
public Queue declareQueue() {
return new Queue("test_queue", true, false, false);
}
@Bean
public DirectExchange declareDirectExchange() {
return new DirectExchange("test_direct_exchange", true, false);
}
@Bean
public Declarables declareBindings() {
return new Declarables(
new Binding("test_queue", DestinationType.QUEUE, "test_direct_exchange", "test_routing_key", null)
);
}
}
我的问题是队列、交换器和绑定不是在应用程序启动时创建的。 Spring开机连连接都不打开。仅当我向队列生成消息时才创建连接、队列等。
经过一些挖掘,我发现我缺少执行器依赖项。 所以添加这个依赖解决了我的问题
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
奇怪的是,除非执行器依赖项存在,否则在应用程序启动时连接不会打开。
如果你想在应用程序启动期间强制声明并且没有任何消费者,你可以将执行器启动器添加到类路径,或者直接自己创建共享连接。
@Bean
ApplicationRunner runner(ConnectionFactory cf) {
return args -> cf.createConnection().close();
}
这不会关闭连接;如果您想这样做,请致电 cf.resetConnection()
.
如果您希望应用程序在代理关闭时启动,请执行以下操作。
@Bean
ApplicationRunner runner(ConnectionFactory cf) {
return args -> {
boolean open = false;
while(!open) {
try {
cf.createConnection().close();
open = true;
}
catch (Exception e) {
Thread.sleep(5000);
}
}
};
}
您可以使用
@Component
public class QueueConfig {
private AmqpAdmin amqpAdmin;
public QueueConfig(AmqpAdmin amqpAdmin) {
this.amqpAdmin = amqpAdmin;
}
@PostConstruct
public void createQueues() {
amqpAdmin.declareQueue(new Queue("q1", true));
amqpAdmin.declareQueue(new Queue("q2", true));
}
}