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

RabbitTemplate连接到RabbitMQ : getting - NOT_FOUND - no队列

商夜洛
2023-03-14

我是Spring的新手,正在开发基于云的应用程序,并尝试使用RabbitTemplate和RabbitMQ。

我能够使用数据存储到队列中。

rabbitTemplate.convertAndSend(QUEUE_NAME, msg);

但是当我从同一个队列接收数据时,使用

rabbitTemplate.receiveAndConvert(QUEUE_NAME)

我的例外情况如下:

ERR 由: java.io.IOException 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:124) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:985) 2016-09-13T11:15:21.38 0530 [App/0] ERR at sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 2016-09-13T11:15:21.38 0530 [应用/0] ERR at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 2016-09-13T11:15:21.38 0530 [App/0] ERR at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 2016-09-13T11:15:21.38 0530 [App/0] ERR at java.lang.reflect.Method.invoke(Method.java:498) 2016-09-13T11:15:21.38 0530 [App/0] ERR atorg.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:625) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.sun.proxy.$Proxy 55.basicGet(未知来源) 2016-09-13T11:15:21.38 0530 [App/0] ERR at org.springframework.amqp.rabbit.core.RabbitTemplate$4.doInRabbit(RabbitTemplate.java:650) 2016-09-13T11:15:21.38 0530 [App/0] ERR at org.springframework.amqp.rabbit.core.RabbitTemplate$4.doInRabbit(RabbitTemplate.java:646) 2016-09-13T11:15:21.38 0530 [App/0] ERR at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1045) 2016-09-13T11:15:21.38 0530 [App/0] ERR ...50 更多 2016-09-13T11:15:21.38 0530 [应用/0] ERR 由以下原因引起: com.rabbitmq.client.ShutdownSignal异常: 通道错误;协议方法:#method(回复代码=404,回复文本=NOT_FOUND - vHost '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列“测试队列”,类 ID = 60,方法 ID = 70) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33) 2016-09-13T11:15:21.38 0530 [App/0] ERR atcom.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation.getReply(AMQChannel.java:343) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:216) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:118) 2016-09-13T11:15:21.38 0530 [App/0] ERR ...60 更多 2016-09-13T11:15:21.38 0530 [应用/0] ERR 由以下原因引起: com.rabbitmq.client.ShutdownSignal异常: 通道错误;协议方法:#method(回复代码=404,回复文本=NOT_FOUND - vhost '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列“测试队列”,类 ID = 60,方法 ID = 70) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:478) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:315) 2016-09-13T11:15:21.38 0530 [App/0] ERR atcom.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:144) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:91) 2016-09-13T11:15:21.38 0530 [App/0] ERR at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:552)

我的代码

@Configuration
@Profile("cloud")
public class RabbitConfig extends AbstractCloudConfig {

@Bean
public RabbitTemplate rabbitTemplate(){
    CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory)connectionFactory().rabbitConnectionFactory();

    cachingConnectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);

    RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);

    return rabbitTemplate;
    }
}

我的控制器:

@RestController
@RequestMapping("mq")
public class MainController {

@Autowired
private RabbitTemplate rabbitTemplate;

private static final String QUEUE_NAME = "testqueue";

@RequestMapping(value = "/putinq/{msg}",method = RequestMethod.PUT)
public String storeMessage(@PathVariable("msg") String msg){
    String result = "";

    rabbitTemplate.setQueue(QUEUE_NAME);
    try {
        rabbitTemplate.convertAndSend(QUEUE_NAME, msg); // no exception
        Thread.sleep(3000);
        Object object = rabbitTemplate.receiveAndConvert(QUEUE_NAME); // getting exception here
          System.out.println("Received: "+object);
        result = "success";
    }catch(Exception ex){
        ex.printStackTrace();
    }

    return result;
}
}

更新RabbitConfig.java

@Configuration
@Profile("cloud")
public class RabbitConfig extends AbstractCloudConfig {

private static final String QUEUE_NAME = "testqueue";

@Bean
public RabbitTemplate rabbitTemplate(){
    CachingConnectionFactory cachingConnectionFactory = (CachingConnectionFactory)(connectionFactory().rabbitConnectionFactory());
    System.out.println("------------------------ Rabbit mq template: " + cachingConnectionFactory.getCacheMode());
    System.out.println("------------------------ cachingConnectionFactory.toString(): " + cachingConnectionFactory.toString());
    cachingConnectionFactory.setCacheMode(CachingConnectionFactory.CacheMode.CHANNEL);
    cachingConnectionFactory.setChannelCacheSize(25);
    System.out.println("----------after set-------------- Rabbit mq template: " + cachingConnectionFactory.getCacheMode());
    System.out.println("------------------------ cachingConnectionFactory.toString(): " + cachingConnectionFactory.getChannelCacheSize());
    RabbitTemplate rabbitTemplate = new RabbitTemplate(cachingConnectionFactory);

    System.out.println("------------------------ Rabbit mq template: " + rabbitTemplate);
    return rabbitTemplate;
}

@Bean
public Queue myQueue() {
    System.out.println("--------------@@---------- creating queue: ");
    final boolean isDurable = true;
    final boolean isExclusive = false;
    final boolean autoDelete = false;
    return new Queue(QUEUE_NAME, isDurable, isExclusive, autoDelete);
}


}

我尝试在互联网上搜索这个,但仍然无法解决问题,长期与这个异常作斗争,任何帮助不胜感激。

找到解决办法了!

CachingConnectionFactory cachingConnectionFactory = new CachingConnectionFactory();
    cachingConnectionFactory.setUsername("");
    cachingConnectionFactory.setPassword("");
    cachingConnectionFactory.setVirtualHost("");
    cachingConnectionFactory.setHost("");
    cachingConnectionFactory.setPort(1);
    cachingConnectionFactory.setRequestedHeartBeat(30);
    cachingConnectionFactory.setConnectionTimeout(30000);

    RabbitAdmin admin = new RabbitAdmin(cachingConnectionFactory());
    Queue queue = new Queue(QUEUE_NAME);
    admin.declareQueue(queue);
    TopicExchange exchange = new TopicExchange(EXCHANGE_NAME);
    admin.declareExchange(exchange);   admin.declareBinding(BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME));
RabbitTemplate template = new RabbitTemplate(cachingConnectionFactory());

共有3个答案

宦翔飞
2023-03-14

您需要绑定您的队列和交换,请尝试下面的RabbitmqConfig

@Configuration
public class RabbitmqConfig  {
    private static final String QUEUE_NAME = "testqueue";

    @Bean
    Queue queue() {
        return new Queue(QUEUE_NAME, false);
    }

    @Bean
    TopicExchange exchange() {
        return new TopicExchange("spring-boot-exchange", true, false);
    }

    @Bean
    Binding binding(Queue queue, TopicExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME);
    }
}
谢涵亮
2023-03-14

您需要在配置中定义队列本身。

@Bean
public org.springframework.amqp.core.Queue myQueue() {
    final boolean isDurable = true;
    final boolean isExclusive = false;
    final boolean autoDelete = false;
    return new org.springframework.amqp.core.Queue(QUEUE_NAME, isDurable, isExclusive, autoDelete);
}
黄君博
2023-03-14

您需要一个 RabbitAdmin @Bean来声明队列/绑定 - 它会自动查找这些类型的 bean,并在建立连接时在代理上声明它们。

如果您使用 Spring 引导,它将自动为您注册模板和管理员。

 类似资料:
  • 我无法连接到具有SEDA队列的骆驼路线。在服务器端,我有以下配置: 我正在尝试从这样的独立客户端访问此路由: 但我的制作人无法连接到seda队列。无法按我的路线排队。无法在我的bean属性中添加camelContext。我正在获取“bean类的属性'camelContext'无效”。如果我将正文发送到SEDA队列,则消息将发送到那里,但不会发送到路由的下一个元素

  • 我正在开发我的第一个Azure实现,我已经设置了我的Azure帐户,并且我使用NuGet为我的应用程序安装了正确的DLL和配置。当我将我的WCF客户端设置为指向服务总线队列并运行该方法时,会出现以下异常: 微软。ServiceBus.服务器错误 我的endpoint配置是: 我的行为是: 这个错误消息非常通用,我不确定我应该首先查看哪个位置

  • 我正在尝试使用ccdt.tab文件连接到队列管理器。以下是我所尝试的: 以下是ccdt.tab中的内容 有谁知道哪里出了问题,怎么修复? PS:我确实看到了那些帖子:在JMS中使用CCDT文件连接到IBM MQ 下面是链接的异常和异常在I时打印出来的: 以下是当我时链接的异常和异常打印:

  • 我已经用RabbitMQ(3.7.6)设置了一个Laravel(5.6)应用程序,使用最新的Laradock和作曲家安装的https://github.com/vyuldashev/laravel-queue-rabbitmq。当我启动Laravel消息工作人员与我得到以下错误 但是,我可以使用telnet 127.0连接到Rabbit。0.1 5672(连接在不活动10秒后关闭)。听众似乎工作正

  • 我试图建立一个队列研究来跟踪应用程序内的用户行为,我想问你是否知道当我使用.join()时如何在pyspark中指定条件: 这两个rdds表示有关用户的信息,其ID为'6df99638e4584a618f92a9cfdf318cf8',并在2016-10-19和2016-10-20登录到服务1和服务2。我的objectif是连接我的两个RDD,每一个至少包含20,000行。所以它必须是一个内部联接