spring amqp-rabbitmq连接不是在应用程序启动时创建的

omvjsjqw  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(373)

我有一个spring启动应用程序,我的目标是在应用程序启动时声明队列、交换和绑定。应用程序将向各个队列生成消息应用程序上将没有使用者。
我已经把这些依赖性包括在我的 pom.xml ```

org.springframework.boot
spring-boot-starter-web
2.3.5.RELEASE


org.springframework.amqp
spring-rabbit
2.2.12.RELEASE

  1. 我的配置类

@Configuration
public class RabbitConfiguration {

  1. @Bean
  2. public ConnectionFactory connectionFactory() {
  3. CachingConnectionFactory connectionFactory = new CachingConnectionFactory("myhost", 5672);
  4. connectionFactory.setUsername("example_name");
  5. connectionFactory.setPassword("example_pass");
  6. return connectionFactory;
  7. }
  8. @Bean
  9. public AmqpAdmin rabbitAdmin(ConnectionFactory connectionFactory) {
  10. return new RabbitAdmin(connectionFactory);
  11. }
  12. @Bean
  13. public Queue declareQueue() {
  14. return new Queue("test_queue", true, false, false);
  15. }
  16. @Bean
  17. public DirectExchange declareDirectExchange() {
  18. return new DirectExchange("test_direct_exchange", true, false);
  19. }
  20. @Bean
  21. public Declarables declareBindings() {
  22. return new Declarables(
  23. new Binding("test_queue", DestinationType.QUEUE, "test_direct_exchange", "test_routing_key", null)
  24. );
  25. }

}

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

4si2a6ki1#

经过一番挖掘,我发现我错过了执行器的依赖性。所以添加这个依赖关系解决了我的问题

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-actuator</artifactId>
  4. </dependency>

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

wnrlj8wa

wnrlj8wa2#

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

  1. @Bean
  2. ApplicationRunner runner(ConnectionFactory cf) {
  3. return args -> cf.createConnection().close();
  4. }

这不会关闭连接;如果你想这么做,打电话给我 cf.resetConnection() .
如果你想在代理关闭时启动应用程序,可以这样做。

  1. @Bean
  2. ApplicationRunner runner(ConnectionFactory cf) {
  3. return args -> {
  4. boolean open = false;
  5. while(!open) {
  6. try {
  7. cf.createConnection().close();
  8. open = true;
  9. }
  10. catch (Exception e) {
  11. Thread.sleep(5000);
  12. }
  13. }
  14. };
  15. }
展开查看全部

相关问题