Загружать контекст весны, даже если rabbitmq не работает
Можно ли загрузить контекст Spring с @RabbitListener, даже если брокер сообщений RabbitMQ не работает? Поведение должно быть таким же, как и в случае отключения брокера. Приложение ожидает брокера, и когда оно восстанавливается, то листернер автоматически переподключается.
Spring Boot 1.3.2.RELEASE
GitHub демонстрационный проект
конфигурация spring-amqp:
@Bean
public MessageConverter jsonMessageConverter() {
return new JsonMessageConverter();
}
@Bean
public ConnectionFactory connectionFactory() {
CachingConnectionFactory connectionFactory = new CachingConnectionFactory(host);
connectionFactory.setUsername(username);
connectionFactory.setPassword(password);
return connectionFactory;
}
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory());
factory.setConcurrentConsumers(10);
factory.setMaxConcurrentConsumers(10);
factory.setMessageConverter(jsonMessageConverter());
return factory;
}
@Bean
public AmqpAdmin amqpAdmin() {
RabbitAdmin rabbitAdmin = new RabbitAdmin(connectionFactory());
rabbitAdmin.setIgnoreDeclarationExceptions(true); // useless
return rabbitAdmin;
}
конфигурация слушателя:
@Service
public class CalculatorServiceV2 {
@RabbitListener(bindings = @QueueBinding(
value = @Queue(value = "calc_service_v2.multiply", durable = "false", autoDelete = "true"),
exchange = @Exchange(value = "calc_service_v2", durable = "false", autoDelete = "true"),
key = "multiply"))
public Result multiply(Operands operands) {
// do something..
}
}
1 ответ
Какую версию Spring AMQP вы используете?
Можете ли вы предоставить трассировку стека? (отредактируйте вопрос, не пытайтесь поместить это в комментарии).
Я только что провел тест, и он работает, как и ожидалось; Контейнер слушателя пытается восстановить соединение каждые 5 секунд (интервал восстановления по умолчанию).
rabbitAdmin.setIgnoreDeclarationExceptions (истина); // бесполезный
В 1.6 (в настоящее время на этапе 1) мы изменили это логическое значение, чтобы пропустить все исключения; ранее он применялся только к исключениям, вызванным ошибками, возвращенными посредником.
Тем не менее, администратор не будет пытаться объявить элементы, пока не будет установлено соединение, так что это должно быть спорным в этом контексте.
Мне нужно увидеть трассировку стека, чтобы понять, что происходит в вашем случае.