首页 > 解决方案 > spring cloud rabbit配置尝试连接localhost 5672

问题描述

有大量使用 java 代码配置纯 rabbit 的示例,但 Spring Boot 相关文档是另一回事。

我的要求非常基本 - 单个队列、单个交换、一个具有预定义名称的死信队列。一些 HA 政策。部署到关键的云代工厂。

该应用程序应使用云连接工厂,因此我不必指定连接信息。如果它们不存在,应用程序应该创建队列/交换。我需要一个可以使用rabbitTemplate 发送消息的控制器。我需要一个侦听器来在多个消费者线程中处理这些消息。

我试图做只属性的方法。我已经尝试了很多豆子来做到这一点。由于某种原因,它不想连接到云服务!

我正在使用 Spring Boot 应用程序并在关键的 Cloud Foundry 中运行它

代码

@Configuration
@EnableRabbit
@Profile("cloud")
@Slf4j
public class RabbitMQConfig extends AbstractCloudConfig {

    final static String MAIN_QUEUE_NAME = "pricing";
    private final static String QUEUE_EXCHANGE_NAME = "pricing-exchange";
    private final static String DEAD_LETTER_QUEUE_NAME = "pricing-dl";

    @Autowired
    RabbitProperties rabbitProperties;

    @Bean("pricingQueue")
    @Primary
    public Queue pricingQueue() {
        return QueueBuilder.durable(MAIN_QUEUE_NAME)
                .withArgument("x-dead-letter-exchange", "")
                .withArgument("x-dead-letter-routing-key", DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public Queue deadLetterQueue() {
        return QueueBuilder.durable(DEAD_LETTER_QUEUE_NAME)
                .withArgument("x-queue-master-locator", "min-masters")
                .build();
    }

    @Bean
    public DirectExchange exchange() {
        return new DirectExchange(QUEUE_EXCHANGE_NAME);
    }

    @Bean
    public Binding pricingBinding(@Qualifier("pricingQueue") Queue pricingQueue,
                                  DirectExchange exchange) {
        return BindingBuilder.bind(pricingQueue).to(exchange).with(MAIN_QUEUE_NAME);
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}


我认为这是因为 Spring Boot 创建了侦听器容器而不是我

错误

[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration' 的共享实例
[main] [DEBUG ] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'management.health.status-org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorProperties' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过构造函数从bean名称'org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration'按类型自动装配到bean命名'management.health.status-org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorProperties'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例的共享实例bean 'healthIndicatorRegistry'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过工厂方法从bean名称'healthIndicatorRegistry'到名为'org.springframework.boot.web.servlet的bean的类型自动装配。 context.AnnotationConfigServletWebServerApplicationContext@6483f5ae'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitHealthIndicator'
[main] [DEBUG] [org.springframework. beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.actuate.autoconfigure.amqp.RabbitHealthIndicatorAutoConfiguration' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitTemplate' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support. DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration$RabbitTemplateConfiguration'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213的共享实例]- 创建单例 bean 'spring.rabbitmq-org.springframework.boot.autoconfigure.amqp.RabbitProperties' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过构造函数从bean名称'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration$RabbitTemplateConfiguration'按类型自动装配到bean命名'spring.rabbitmq-org.springframework.boot.autoconfigure.amqp.RabbitProperties'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitConnectionFactory' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration$RabbitConnectionFactoryCreator' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过工厂方法从bean名称'rabbitConnectionFactory'到名为'spring.rabbitmq-org.springframework.boot的bean类型自动装配。 autoconfigure.amqp.RabbitProperties'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]- 通过工厂方法从 bean 名称“rabbitTemplate”到名为“rabbitConnectionFactory”的 bean 按类型自动装配
[main ] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'jsonMessageConverter' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitMQConfig' 的共享实例

...

[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过工厂方法从bean名称'viewResolver'到名为'org.springframework.beans.factory.support的bean类型自动装配。 DefaultListableBeanFactory@1dde4cb2'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'amqpAdmin'
[main] [DEBUG] [org.springframework.beans. factory.support.DefaultListableBeanFactory.createArgumentArray:777]- 通过工厂方法从 bean 名称“amqpAdmin”到名为“rabbitConnectionFactory”的 bean 按类型自动装配
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration$MessagingTemplateConfiguration' 的共享实例
[main] [DEBUG ] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitMessagingTemplate' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777 ]- 通过工厂方法从 bean 名称“rabbitMessagingTemplate”到名为“rabbitTemplate”的 bean 按类型自动装配
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.autoconfigure.amqp.RabbitAnnotationDrivenConfiguration' 的共享实例
[main] [DEBUG] [ org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]-通过构造函数从bean名称'org.springframework.boot.autoconfigure.amqp.RabbitAnnotationDrivenConfiguration'到名为'spring.rabbitmq-org.springframework的bean的类型自动装配。 boot.autoconfigure.amqp.RabbitProperties'
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'simpleRabbitListenerContainerFactoryConfigurer' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'rabbitListenerContainerFactory' 的共享实例
[main] [DEBUG] [org.springframework.beans.factory.support. DefaultListableBeanFactory.createArgumentArray:777]- 按类型从 bean 名称“rabbitListenerContainerFactory”通过工厂方法自动装配到名为“simpleRabbitListenerContainerFactoryConfigurer”的 bean
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.createArgumentArray:777]- 自动装配按类型从 bean 名称“rabbitListenerContainerFactory”通过工厂方法到名为“rabbitConnectionFactory”的 bean
[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'directRabbitListenerContainerFactoryConfigurer' 的共享实例

...

[main] [DEBUG] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'org.springframework.boot.actuate.autoconfigure.web.server.ManagementContextAutoConfiguration' 的共享实例
[main] [调试] [org.springframework.beans.factory.support.DefaultListableBeanFactory.getSingleton:213]- 创建单例 bean 'management.server-org.springframework.boot.actuate.autoconfigure.web.server.ManagementServerProperties' 的共享实例
[main ] [DEBUG] [org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.:264]- public void com.gm.gsmc.pricing.messenger.service.PricingMessageListener.handleMessage(com.gm.gsmc) 的推断参数类型.pricing.domain.queue.QueueMessage) 是 com.gm.gsmc.pricing.domain.queue 类。队列消息
[main] [DEBUG] [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.setConcurrentConsumers:166]- 将消费者从 1 更改为 5
[main] [DEBUG] [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.start :1293]- 启动 Rabbit 侦听器容器。
[main] [INFO] [org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareConnection:482]- 尝试连接到:[localhost:5672]
[main] [INFO] [org.springframework.amqp.rabbit.listener .SimpleMessageListenerContainer.checkMismatchedQueues:1713]- 代理不可用;在启动期间无法强制队列声明:java.net.ConnectException:连接被拒绝(连接被拒绝)
[org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [INFO] [org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createBareConnection:482]- 尝试连接到:[localhost:5672]
[org.springframework.amqp.rabbit.RabbitListenerEndpointContainer#0-1] [错误] [org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.redeclareElementsIfNecessary:1764]- 无法检查/重新声明自动删除队列。java.net.ConnectException:连接被拒绝(连接被拒绝)\n 在 java.net.PlainSocketImpl.socketConnect(本机方法)~[na:1.8.0_212]\n 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350 ) ~[na:1.8.0_212]\n 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_212]\n 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188 ) ~[na:1.8.0_212]\n 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_212]\n 在 java.net.Socket.connect(Socket.java:589 ) ~[na:1.8.0_212]\n 在 com.rabbitmq.client。

标签: spring-bootrabbitmqspring-rabbit

解决方案


我不确定为什么amqpAdmin在 bean 定义中有这些调用(尽管它们已被注释掉)。您绝不能在 bean 定义中与代理交谈 - 这在生命周期中还为时过早。

第一个日志中的错误让我相信没有被注释掉。该日志看起来也被截断了 - 应该有Caused by部分。在提出问题时,您永远不应该截断日志。部分堆栈跟踪是无用的。

工厂方法“msgQueueBinding”抛出异常;嵌套异常是 org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection denied (Connection denied)

msgQueueBinding这清楚地显示了从该方法连接的尝试。

以下日志显示了侦听器启动时成功声明的队列/交换/绑定。

我猜您的管理员调用是在云代码替换连接工厂 bean 定义之前发生的。


推荐阅读