当前位置: 首页 > 知识库问答 >
问题:

Spring boot rabbitmq在vhost'/'中没有交换''xxxxxxx''

宰鸿博
2023-03-14

我写一个简单的Rabbitmq生产者与Spring启动2.2.7。

在代理端,我设置了一个直接交换示例,一个名为samples的队列。默认值,并将它们绑定在一起添加示例。默认绑定键。

运行应用程序时,我得到以下错误

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”队列。

在SpringBoot中,我使用了jackson序列化,但我认为这不是这里的问题,因为我在没有Jakson序列化配置的情况下测试了代码,问题仍然是一样的。

我的代理配置是在应用程序中设置的。特性:

#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。兔子。主机不工作,因为它会导致使用我的internet提供商地址!

在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);
            }
    }

}

我用在Rest控制器上

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()));

}

因此,代理连接正常,但找不到交换

并且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

任何想法?

提前感谢。

共有1个答案

胡高寒
2023-03-14

错误似乎很明显:

vhost中不交换“样本”

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

删除引号

broker.exchange=samples
broker.routingKey=samples.default
 类似资料:
  • 我知道这个问题以前有人问过,但我找不到任何合适的解决办法,因此再次张贴。 我只有一个简单的producer类,它使用上面的amqpTemplate发送一条消息。但当我尝试运行我的生产者应用程序时,我得到的只是:在vhost“/”错误中没有exchange“my.exchange” 如果你能在这方面提供帮助,我将不胜感激。多谢了。

  • 我正在编写一个ELF分析器,但我在正确转换endianness时遇到了一些问题。我有一些函数来确定分析器的endianness和目标文件的endianness。 基本上,有四种可能的情况: 在big-endian对象文件上运行的big-endian编译分析器 什么都不需要转换 字节顺序需要交换,但ntohs/l()和htons/l()都是big-endian机器上的空宏,因此它们不会交换字节顺序。

  • Install $ npm install vhost API var vhost = require('vhost') vhost(hostname, handle) Create a new middleware function to hand off request to handle when the incoming host for the request matches h

  • 问题内容: 在Python中,我已经看到使用此语法交换了两个变量值: 这是否被认为是交换两个变量值的标准方法,还是有其他一些习惯上最常用的交换两个变量的方法? 问题答案: Python从左到右计算表达式。请注意,在评估分配时,右侧的评估先于左侧。 http://docs.python.org/3/reference/expressions.html#evaluation-order 这意味着该表达

  • 问题内容: 我有一个带有坐标的MySQL表,列名称为X和Y。现在我想交换此表中的列值,以使X成为Y,Y成为X。最明显的解决方案是重命名列,但是我不想进行结构更改,因为我不一定有这样做的权限。 这可能以某种方式与 UPDATE 有关吗? UPDATE表SET X = Y,Y = X 显然不会满足我的要求。 编辑:请注意,我上面提到的权限限制有效地阻止了ALTER TABLE或其他更改表/数据库结构的

  • 问题内容: 我有一个按钮 我无法通过ID或名称找到它,需要提交表格。 我尝试这样做:或者,WebDriver在每个元素上都有便捷的方法“提交”。如果在表单中的元素上调用此方法,则WebDriver将在DOM上移动,直到找到封闭的表单,然后在该表单上调用Submit。如果元素不是表单,则将引发NoSuchElementException:element.submit() http://seleniu