Spring boot 要连接到RabbitMQ的RabbitTemplate:正在获取-未找到-无队列

Spring boot 要连接到RabbitMQ的RabbitTemplate:正在获取-未找到-无队列,spring-boot,spring-cloud,spring-rabbit,Spring Boot,Spring Cloud,Spring Rabbit,我刚接触spring,正在开发基于云的应用程序,并尝试使用RabbitTemplate和RabbitMQ 我能够使用将数据存储到队列 rabbitTemplate.convertAndSend(QUEUE_NAME, msg); 但是当我使用 rabbitTemplate.receiveAndConvert(QUEUE_NAME) 我得到的例外是: 由以下原因导致的错误:java.io.IOException 2016-09-13T11:15:21.38+0530[App/0]错误位于com

我刚接触spring,正在开发基于云的应用程序,并尝试使用RabbitTemplate和RabbitMQ

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

rabbitTemplate.convertAndSend(QUEUE_NAME, msg);
但是当我使用

rabbitTemplate.receiveAndConvert(QUEUE_NAME)
我得到的例外是:

由以下原因导致的错误:java.io.IOException 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.exnwrapingrpc(AMQChannel.java:124) 2016-09-13T11:15:21.38+0530[App/0]错误:com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java:985) 2016-09-13T11:15:21.38+0530[App/0]在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处出错 2016-09-13T11:15:21.38+0530[App/0]在sun.reflect.NativeMethodAccessorImpl.invoke处出错(NativeMethodAccessorImpl.java:62) 2016-09-13T11:15:21.38+0530[App/0]在sun.reflect.DelegatingMethodAccessorImpl.invoke处出错(DelegatingMethodAccessorImpl.java:43) 2016-09-13T11:15:21.38+0530[App/0]java.lang.reflect.Method.invoke处出错(Method.java:498) 2016-09-13T11:15:21.38+0530[App/0]错误位于org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:625) 2016-09-13T11:15:21.38+0530[App/0]错误地址:com.sun.proxy.$Proxy55.basicGet(未知来源) 2016-09-13T11:15:21.38+0530[App/0]ERR位于org.springframework.amqp.rabbit.core.rabbitmplate$4.doInRabbit(rabbitmplate.java:650) 2016-09-13T11:15:21.38+0530[App/0]ERR位于org.springframework.amqp.rabbit.core.rabbitmplate$4.doInRabbit(rabbitmplate.java:646) 2016-09-13T11:15:21.38+0530[App/0]ERR位于org.springframework.amqp.rabbit.core.rabbitmplate.doExecute(rabbitmplate.java:1045) 2016-09-13T11:15:21.38+0530[App/0]错误。。。50多 2016-09-13T11:15:21.38+0530[App/0]由以下原因导致的错误:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列'testqueue',类id=60,方法id=70) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.utility.BlockingValueOrException.unterruptiblegetvalue(BlockingValueOrException.java:33) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel$blockingrpccontuation.getReply(AMQChannel.java:343) 2016-09-13T11:15:21.38+0530[App/0]错误,请访问com.rabbitmq.client.impl.AMQChannel.privatepc(AMQChannel.java:216) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.exnwrapingrpc(AMQChannel.java:118) 2016-09-13T11:15:21.38+0530[App/0]错误。。。60多 2016-09-13T11:15:21.38+0530[App/0]由以下原因导致的错误:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列'testqueue',类id=60,方法id=70) 2016-09-13T11:15:21.38+0530[App/0]在com.rabbitmq.client.impl.ChannelN.asyncShutdown上出错(ChannelN.java:478) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:315) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:144) 2016-09-13T11:15:21.38+0530[App/0]错误位于com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:91) 2016-09-13T11:15:21.38+0530[App/0]错误位于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());

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

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

您需要绑定队列和交换,请尝试下面的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);
    }
}

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


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

嗨,Jeff,感谢您的回复,我仍然收到相同的错误:由com.rabbitmq.client.ShutdownSignalException引起:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列'testqueue',类id=60,方法id=70)您是否将其放入RabbitConfig并使用配置文件云运行?(-Dspring.profiles.active=cloud作为大多数IDE中的运行参数或vm参数)Ya Jeff,我已经粘贴了更新的RabbitConfig.javaYou
Binding
your
Queue
Exchange
?如果删除rabbitTemplate()方法?获取相同错误:由以下原因引起的错误:com.rabbitmq.client.ShutdownSignalException:通道错误;协议方法:#方法(回复代码=404,回复文本=未找到-vhost'9cc1b4db-636e-4251-bb68-c7ed7f3be1d3'中没有队列'testqueue',类id=60,方法id=70)发送到队列没有给出错误,但接收抛出上述错误exception@RiteshKaushik请尝试删除
rabbitmplate.setQueue(队列名称)来自你的代码。亚丽萍,那样做了,运气不好!我不知道为什么它仍然给出这个错误。@RiteshKaushik你能去rabbitmq管理员那里检查队列/通道吗?