Загружать контекст весны, даже если 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) мы изменили это логическое значение, чтобы пропустить все исключения; ранее он применялся только к исключениям, вызванным ошибками, возвращенными посредником.

Тем не менее, администратор не будет пытаться объявить элементы, пока не будет установлено соединение, так что это должно быть спорным в этом контексте.

Мне нужно увидеть трассировку стека, чтобы понять, что происходит в вашем случае.

Другие вопросы по тегам