RabbitTemplate для подключения к RabbitMQ: получение - NOT_FOUND - нет очереди

Я новичок в Spring и работаю над облачным приложением и пытаюсь использовать RabbitTemplate и RabbitMQ.

Я могу хранить данные в очереди, используя.

rabbitTemplate.convertAndSend(QUEUE_NAME, msg);

Но когда я получаю данные из той же очереди, используя

rabbitTemplate.receiveAndConvert(QUEUE_NAME)

Я получаю исключение как:

Мой код:

Мой контроллер:

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

ОБНОВЛЕНО RabbitConfig.java

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

Я пытался найти это в Интернете, но все же не могу решить проблему. Долго борюсь с этим исключением, любая помощь приветствуется.

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


}

Получил решение!

Вам нужен

rabbitTemplate.convertAndSend(QUEUE_NAME, msg);
rabbitTemplate.receiveAndConvert(QUEUE_NAME)
для объявления очередей/привязок - он автоматически находит bean-компоненты этих типов и объявляет их в брокере при установке соединения.

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

person Ritesh Kaushik    schedule 13.09.2016    source источник


Ответы (3)


Если вы используете Spring Boot, он автоматически зарегистрирует для вас шаблон и администратора.

Вам нужно определить саму очередь в вашей конфигурации.

person Gary Russell    schedule 13.09.2016

Вам нужно связать свою очередь и обмен, попробуйте этот RabbitmqConfig ниже

@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);
}
person Jeff    schedule 13.09.2016
comment
Вы поместили его в свой RabbitConfig и запустили с облаком профилей? (-Dspring.profiles.active=облако в качестве аргумента запуска или аргумента vm в большинстве IDE) - person Ritesh Kaushik; 13.09.2016
comment
Я, Джефф, я вставил обновленный RabbitConfig.java. - person Jeff; 13.09.2016
comment
Вы _1_ свои _2_ и _3_? - person Ritesh Kaushik; 13.09.2016
comment
Что произойдет, если вы удалите метод rabbitTemplate()? - person Liping Huang; 13.09.2016
comment
Привет, Липинг, я делаю «cf push ‹app_name›», я думаю, это автоматическая привязка экземпляра RabbitMQ к моему весеннему приложению. Нужно ли явно привязывать очередь и обмениваться? - person Jeff; 13.09.2016
comment
Убедитесь, что ваша очередь определена до вашего RabbitTemplate. - person Ritesh Kaushik; 13.09.2016
comment
Вам нужен _1_ _2_ для выполнения объявлений (очередей/привязок) - он обнаруживает bean-компоненты при установлении соединения. - person Jeff; 13.09.2016
comment
получение той же ошибки: ERR Вызвано: com.rabbitmq.client.ShutdownSignalException: ошибка канала; метод протокола: #method‹channel.close›(код_ответа=404, текст ответа=NOT_FOUND - нет очереди 'testqueue' в vhost '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3', class-id=60, метод- идентификатор = 70) - person Gary Russell; 13.09.2016

Привет, Джефф, спасибо за ответ, я все еще получаю ту же ошибку: Причина: com.rabbitmq.client.ShutdownSignalException: ошибка канала; метод протокола: #method‹channel.close›(код_ответа=404, текст ответа=NOT_FOUND - нет очереди 'testqueue' в vhost '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3', class-id=60, метод- идентификатор = 70)

@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);
    }
}
person Liping Huang    schedule 13.09.2016
comment
отправка в очередь не дает ошибки, но получение вызывает указанное выше исключение - person Ritesh Kaushik; 13.09.2016
comment
@RiteshKaushik, пожалуйста, попробуйте удалить _1_ из своего кода. - person Ritesh Kaushik; 13.09.2016
comment
Я. Липин, сделал это, не повезло! Я не знаю, почему он все еще дает эту ошибку. - person Liping Huang; 13.09.2016
comment
@RiteshKaushik, вы можете пойти к администратору rabbitmq, чтобы проверить очередь / канал? - person Ritesh Kaushik; 13.09.2016
comment
на самом деле я следовал приведенному ниже примеру: github.com/PredixDev/predix-rabbitmq-cf. Также использую свой собственный облачный экземпляр для RabbitMQ. - person Liping Huang; 13.09.2016
comment
@RiteshKaushik, проект на самом деле довольно прост, я не уверен, но, возможно, вам следует проверить часть cf. - person Ritesh Kaushik; 13.09.2016
comment
ОШИБКА Причина: java.io.IOException 2016-09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:106) 2016-09-13T11 :15:21.38+0530 [App/0] ERR на com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:102) 2016-09-13T11:15:21.38+0530 [App/0] ERR на com .rabbitmq.client.impl.AMQChannel.exnWrappingRpc(AMQChannel.java:124) 2016-09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.ChannelN.basicGet(ChannelN.java :985) 2016-09-13T11:15:21.38+0530 [App/0] ERR at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 2016-09-13T11:15:21.38+0530 [App/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 в java.lang.reflect.Method.invoke(Method.java:498) 2016-09- 13T11:15:21.38+0530 [App/0] ERR в org.springframework.amqp.rabbit.connection.CachingConnectionFactory$CachedChannelInvocationHandler.invoke(CachingConnectionFactory.java:625) 2016-09-13T11:15:21.38+0530 [App/ 0] ERR на com.sun.proxy.$Proxy55.basicGet(неизвестный источник) 2016-09-13T11:15:21.38+0530 [App/0] ERR на org.springframework.amqp.rabbit.core.RabbitTemplate$4.doInRabbit (RabbitTemplate.java:650) 2016-09-13T11:15:21.38+0530 [App/0] ERR в org.springframework.amqp.rabbit.core.RabbitTemplate$4.doInRabbit(RabbitTemplate.java:646) 2016-09- 13T11:15:21.38+0530 [App/0] ERR на 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 [App/0] ERR Причина: com.rabbitmq.client.ShutdownSignalException: ошибка канала; метод протокола: #method(код_ответа=404, текст_ответа=NOT_FOUND - нет очереди 'testqueue' в виртуальном хосте '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3', идентификатор класса = 60, идентификатор метода = 70) < /strong> 2016-09-13T11:15:21.38+0530 [Приложение/0] ERR в com.rabbitmq.utility.ValueOrException.getValue(ValueOrException.java:67) 2016-09-13T11:15:21.38+0530 [Приложение /0] ERR в com.rabbitmq.utility.BlockingValueOrException.uninterruptibleGetValue(BlockingValueOrException.java:33) 2016-09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.AMQChannel$BlockingRpcContinuation .getReply(AMQChannel.java:343) 2016-09-13T11:15:21. 38+0530 [App/0] ERR на com.rabbitmq.client.impl.AMQChannel.privateRpc(AMQChannel.java:216) 2016-09-13T11:15:21.38+0530 [App/0] ERR на 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 [App/ 0] ERR Причина: com.rabbitmq.client.ShutdownSignalException: ошибка канала; метод протокола: #method(код-ответа=404, текст-ответа=NOT_FOUND - нет очереди 'testqueue' в виртуальном хосте '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3', идентификатор класса = 60, идентификатор метода = 70) 2016 -09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:478) 2016-09-13T11:15:21.38+0530 [App/0 ] ERR в com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:315) 2016-09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand (AMQChannel.java:144) 2016-09-13T11:15:21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:91) 2016-09-13T11:15 :21.38+0530 [App/0] ERR в com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:552) - person Liping Huang; 13.09.2016