Я тестирую шаблон запроса/ответа с реализацией кролика Spring-AMQP, и я не могу заставить его работать...
У меня настроены следующие артефакты:
test_exchange с очередью приветствия. Ключ маршрутизации = приветствие
answer_exchange с очередью ответов. Ключ маршрутизации = ответы
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory =
new CachingConnectionFactory("....IP of broker...");
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
return connectionFactory;
}
@Bean
public Queue greeting() {
return new Queue("greeting");
}
@Bean
public Queue replies() {
return new Queue("replies");
}
MessageListener receiver() {
return new MessageListenerAdapter(new RabbitMqReceiver(), "onMessage");
}
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, Queue replies) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setExchange("test_exchange");
template.setRoutingKey("greeting");
template.setReplyAddress("reply_exchange"+"/"+replies.getName());
template.setReplyTimeout(60000);
return template;
}
@Bean
public SimpleMessageListenerContainer replyContainer(ConnectionFactory connectionFactory,
RabbitTemplate rabbitTemplate, Queue replies) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setMessageListener(rabbitTemplate);
container.setQueues(replies);
return container;
}
@Bean
public SimpleMessageListenerContainer serviceListenerContainer(
ConnectionFactory connectionFactory) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(greeting());
container.setMessageListener(receiver());
return container;
}
Я следовал примеру на github, но он вылетает:
Вызвано: java.lang.IllegalStateException: RabbitTemplate не настроен как MessageListener — нельзя использовать «replyAddress»: answer_exchange/replies
В документации говорится:
Начиная с версии 1.5, RabbitTemplate определяет, настроен ли он как MessageListener для получения ответов. В противном случае попытки отправки и получения сообщений с адресом ответа завершатся с ошибкой IllegalStateException (поскольку ответы никогда не будут получены).
Это отлично, но как RabbitTemplate это делает? Как он определяет, настроен ли он как MessageListener?
заранее спасибо
PS: пришлите код:
public void send() {
Message message = MessageBuilder.withBody("Payload".getBytes())
.setContentType("text/plain")
.build();
Message reply = this.template.sendAndReceive(message);
System.out.println("Reply from server is: "+new String(reply.getBody()));
}