Java Spring AMQP-未在应用程序启动时创建RabbitMQ连接

Java Spring AMQP-未在应用程序启动时创建RabbitMQ连接,java,spring,spring-boot,rabbitmq,spring-amqp,Java,Spring,Spring Boot,Rabbitmq,Spring Amqp,我有一个Spring引导应用程序,我的目标是在应用程序启动时声明队列、交换和绑定。应用程序将向各种队列生成消息。应用程序上不会有使用者 我已经在我的pom.xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.3.5

我有一个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>

我的问题是,队列、交换和绑定不是在应用程序启动时创建的。Spring boot甚至无法打开连接。只有当我向队列生成消息时,才会创建连接、队列等。

经过一些挖掘,我发现我缺少执行器依赖项。 所以添加这个依赖项解决了我的问题

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

org.springframework.boot
弹簧靴起动器执行器

奇怪的是,除非存在执行器依赖项,否则在应用程序启动时连接不会打开。

如果您想在应用程序启动期间强制声明,并且没有任何使用者,您可以将执行器启动程序添加到类路径,或者自己创建共享连接

@Bean
ApplicationRunner运行程序(ConnectionFactory cf){
返回参数->cf.createConnection().close();
}
这不会关闭连接;如果要执行此操作,请调用
cf.resetConnection()

如果您希望在代理关闭时启动应用程序,请执行以下操作

@Bean
ApplicationRunner运行程序(ConnectionFactory cf){
返回参数->{
布尔开=假;
当(!打开){
试一试{
cf.createConnection().close();
开放=真实;
}
捕获(例外e){
睡眠(5000);
}
}
};
}

只有在您第一次需要时才会建立连接;当您发送消息时,或者通过配置侦听器容器(例如,
@RabbitListener
),默认情况下,该容器将自动启动。通过添加上述依赖项,我需要在启动时建立连接。我不需要配置侦听器容器,因为我的应用程序上没有任何使用者。我希望在应用程序启动时创建队列,因为在我的消费者应用程序上,我不希望消费者尝试从不存在的队列中消费。如果不需要执行器,另一个解决方案是添加
ApplicationRunner
bean<代码>@Bean ApplicationRunner runner(ConnectionFactory cf){cf.createConnection();}也有效,您可以将其作为答案发布,以便人们更容易找到它。我认为您的解决方案更健壮,因为仅为此添加执行器依赖性并不好。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>