Spring boot rabbitmq no exchange '"xxxxxxx"' in vhost '/'
Spring boot rabbitmq no exchange '"xxxxxxx"' in vhost '/'
我正在用 spring boot 2.2.7.
编写一个简单的 rabbitmq 生产者
在经纪人方面,我设置了一个 直接交换 样本,一个队列命名为 samples.default 并添加 samples.default bindkey key 将它们绑定在一起。
当运行应用程序出现以下错误
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 引导中我正在使用 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 配置中 class :
@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();
}
}
发布商基础 class 为:
@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连接正常但是找不到交易所
并且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
有什么想法吗?
提前致谢。
错误似乎很明显:
no exchange '"samples"' in vhost
broker.exchange = "samples"
broker.routingKey = "samples.default"
删除引号
broker.exchange=samples
broker.routingKey=samples.default
我正在用 spring boot 2.2.7.
编写一个简单的 rabbitmq 生产者在经纪人方面,我设置了一个 直接交换 样本,一个队列命名为 samples.default 并添加 samples.default bindkey key 将它们绑定在一起。
当运行应用程序出现以下错误
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 引导中我正在使用 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 配置中 class :
@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();
}
}
发布商基础 class 为:
@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连接正常但是找不到交易所
并且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
有什么想法吗?
提前致谢。
错误似乎很明显:
no exchange '"samples"' in vhost
broker.exchange = "samples"
broker.routingKey = "samples.default"
删除引号
broker.exchange=samples
broker.routingKey=samples.default