【问题标题】:Spring boot rabbitmq no exchange '"xxxxxxx"' in vhost '/'Spring boot rabbitmq no exchange '"xxxxxxx"' in vhost '/'
【发布时间】:2020-05-14 23:20:00
【问题描述】:

我正在使用 spring boot 2.2.7 编写一个简单的 rabbitmq producer。

在代理方面,我设置了一个 direct exchange samples ,一个名为 samples.defaultqueue并将它们绑定在一起添加一个 samples.default bindkey 键

运行应用程序时出现以下错误

Attempting to connect to: [127.0.0.1:5672]
2020-05-14 15:13:39.232  INFO 28393 --- [nio-8080-exec-1] o.s.a.r.c.CachingConnectionFactory       : Created new connection: rabbitConnectionFactory#2f860823:0/SimpleConnection@3946e760 [delegate=amqp://open-si@127.0.0.1:5672/, localPort= 34710]
2020-05-14 15:13:39.267 ERROR 28393 --- [ 127.0.0.1:5672] o.s.a.r.c.CachingConnectionFactory       : Channel shutdown: channel error; protocol method: #method<channel.close>(reply-code=404, reply-text=NOT_FOUND - no exchange '"samples"' in vhost '/', class-id=60, method-id=40)

rabbitmq 服务器配置是正确的,因为我有一个 python 生产者已经成功地将消息放入“samples.default”队列中。

在 Spring boot 中,我使用的是 jackson 序列化,但我认为这不是问题所在,因为我已经在没有 Jakson 序列化配置的情况下测试了代码,但问题仍然存在。

我的代理配置是在 application.properties 中设置的:

#spring.rabbitmq.host=localhost
spring.rabbitmq.addresses=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=xxxx
spring.rabbitmq.password=xxxx

broker.exchange = "samples"
broker.routingKey = "samples.default"

请注意,使用 spring.rabbitmq.host 不起作用,因为它会导致使用我的互联网提供商地址

BrokerConf 配置类中:

@Configuration
public class BrokerConf {

    @Bean("publisher")
    MessagePublisher<BaseSample> baseSamplePublisher(RabbitTemplate rabbitTemplate) {
        return new MessagePublisher<BaseSample>(rabbitTemplate);
    }


    @Bean
    public RabbitTemplate rabbitTemplate(final ConnectionFactory connectionFactory) {
        final var rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setMessageConverter(producerJackson2MessageConverter());
        return rabbitTemplate;
    }

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

发布者基类如下:

@Component
public class MessagePublisher<T> {

    private static final Logger log = LoggerFactory.getLogger(MessagePublisher.class);
    private final RabbitTemplate rabbitTemplate;

    public MessagePublisher(RabbitTemplate r) {
        rabbitTemplate = r;
    }

    public void publish(List<BaseSample> messages, String exchange, String routingKey) {
            for (BaseSample message: messages) {
                rabbitTemplate.convertAndSend(exchange, routingKey, message);
            }
    }

}

我在休息控制器中使用的

private static final Logger logger = LoggerFactory.getLogger(SamplesController.class);
@Autowired
private MessagePublisher<BaseSample> publisher;

@Value("${broker.exchange}")
private String exchange;
@Value("${broker.routingKey}")
private String routingKey;


@PutMapping(value = "/new", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<SampleAck> add(@RequestBody List<BaseSample> samples) {

    publisher.publish(samples, exchange, routingKey);

    return ResponseEntity.ok(new SampleAck(samples.size(), new Date()));

}

所以broker连接正常,但是没有找到exchange

并且rabbitmq资源存在

xxxxxx@xxxxxxx:~/factory/udc-collector$ sudo rabbitmqctl list_exchanges
Listing exchanges for vhost / ...
name    type
amq.topic   topic
amq.rabbitmq.trace  topic
amq.match   headers
amq.direct  direct
amq.fanout  fanout
    direct
amq.rabbitmq.log    topic
amq.headers headers
samples direct

xxxx@xxxxx:~/factory/udc-collector$ sudo rabbitmqctl list_queues
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name    messages
samples.default 2

有什么想法吗?

提前致谢。

【问题讨论】:

    标签: spring-boot spring-rabbit rabbitmq-exchange


    【解决方案1】:

    错误似乎很明显:

    虚拟主机中没有交换“样本”

    broker.exchange = "samples"
    broker.routingKey = "samples.default"
    

    去掉引号

    broker.exchange=samples
    broker.routingKey=samples.default
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-18
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多