RabbitTemplate для подключения к RabbitMQ: получение - NOT_FOUND - без очереди
Я новичок в весне и работаю над облачным приложением и пытаюсь использовать 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 в 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 в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) 2016-09-13T11: 15: 21.38 + 0530 [App / 0] ERR в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 2016-09-13T11:15:21.38+0530 [App/0] ERR в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethod-09java) 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 в орг.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 Причина by: com.rabbitmq.client.ShutdownSignalException: ошибка канала; Метод протокола: #method(код ответа =404, текст ответа =NOT_FOUND - нет очереди 'testqueue' в vhost '9cc1b4db-636e-4251-bb68-c7ed7f3be1d3', идентификатор класса =60, идентификатор метода = 70) 2016 -09-13T11: 15: 21.38 + 0530 [App / 0] ERR в 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] ОШИБКА в com.rabbitmq.client.impl.AMQChannel$BlockingRpCControl.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' в vhost '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)
Мой код:
@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 ответа
Тебе необходимо RabbitAdmin
@Bean
объявлять очереди / привязки - он автоматически находит bean-компоненты этих типов и объявляет их в посреднике, когда соединение установлено.
Если вы используете Spring Boot, он автоматически зарегистрирует шаблон и администратора для вас.
Вам необходимо связать свою очередь и обмен, пожалуйста, попробуйте этот 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);
}
}
Вам необходимо определить саму очередь в вашей конфигурации.
@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);
}