Есть ли возможность установить AutomaticRecoveryEnabled в RabbitMQ с помощью Spring-AMQP?

1

Заполняется при использовании RabbitMQ с использованием Spring-AMQP.

Просто нужно получить способ настройки AutomaticRecoveryEnabled и NetworkRecoveryInterval с использованием Spring-AMQP. Существует прямая опция установки этих флагов, если вы разрабатываете собственную библиотеку RabbitMQ. Но я не нашел обходного пути, чтобы сделать то же самое, используя весну

Использование RabbitMQ Native library (не нужно никакой помощи)

factory.setAutomaticRecoveryEnabled(true);
factory.setNetworkRecoveryInterval(10000);

Использование Spring-AMPQ (нужна помощь)

Как и выше, я не нашел такого метода при попытке использовать Spring-AMPQ. Это то, что я делаю сейчас.

@Bean(name="listener")
public SimpleMessageListenerContainer listenerContainer() 
{
    SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
    container.setConnectionFactory(connectionFactory());
    container.setQueueNames(env.getProperty("mb.queue"));
    container.setMessageListener(new MessageListenerAdapter(messageListener));
    return container;
}

Любая помощь в этом отношении очень заметна. Заранее спасибо.

Теги:
spring
spring-amqp
rabbitmq
spring-rabbit

2 ответа

1
Лучший ответ

Ну, у CachingConnectionFactory есть другой CachingConnectionFactory для применения com.rabbitmq.client.ConnectionFactory.

Таким образом, этого достаточно, чтобы скомпоновать последний в качестве дополнительного @Bean с соответствующими параметрами и ввести его в CachingConnectionFactory.

  • 3
    Однако этот параметр не требуется для Spring AMQP - он восстанавливал соединение (на стороне потребителя) с RabbitTemplate дня. Вы можете использовать его на стороне производителя или просто добавить шаблон повторения в RabbitTemplate - вы можете получить некоторые нежелательные побочные эффекты при использовании этой опции с SimpleMessageListenerContainer поскольку контейнер ничего не знает о восстановленных потребителях.
  • 0
    Спасибо Artem. Я нашел наш другой метод (setRecoveryInterval (время в миллисекундах)) SimpleMessageListenerContainer, делающий то же самое. Кстати, по умолчанию это 5 секунд, хотя вы не будете использовать этот метод, это действительно хорошо.
Показать ещё 1 комментарий
5

Просто для уточнения; Spring AMQP НЕ совместим с automaticRecoveryEnabled.

Он имеет свои собственные механизмы восстановления и не знает о том, как происходит восстановление, выполняемое клиентом. Это оставляет свисающие соединения и Канал (ы).

Я работаю над временным обходом, который сделает его совместимым (но эффективно отключит восстановление клиентов любыми соединениями/каналами, используемыми Spring AMQP, оставив восстановление клиента на месте для других пользователей той же фабрики соединений.

Для более долговременного исправления потребуется переписывать контейнер слушателя вместо использования кода восстановления клиента.

  • 0
    Спасибо за обновление Grey Russell. Вы имеете в виду, что Spring внутренне позаботится о отказоустойчивости и автоматическом восстановлении.
  • 0
    Да, как я сказал в своем комментарии к ответу Артема, у нас было восстановление с первого дня; автоматический для потребителей (контейнер слушателя) и использование RetryTemplate в RabbitTemplate для издателей.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню