Spring Amqp - динамически отключить / включить RabbitListener во время работы пакета DB - PullRequest
1 голос
/ 03 мая 2019

У нас есть сценарий, когда сообщения извлекаются из очереди Amqp и записываются в нашу БД. Однако во время запланированных пакетных запусков БД БД недоступна, и мы не можем писать, поэтому мы хотели бы, чтобы сообщения оставались в памяти. очередь во время этих окон.

Я пытаюсь выяснить лучший способ справиться с этим - просто сгенерировать исключение в методе @RabbitListener для (многократного) добавления в очередь сообщений или с помощью попытки планировщика Spring остановить / запустить прослушиватель (я вижу, что SimpleMessageListenerContainer имеет методы остановки / запуска).

Какие-либо предложения относительно лучших (или лучших) подходов?

1 Ответ

0 голосов
/ 03 мая 2019

Еще один способ принять во внимание - это возможности ответа на слушателе.

См. AbstractRabbitListenerContainerFactory JavaDocs:

/**
 * Set a {@link RetryTemplate} to use when sending replies; added to each message
 * listener adapter.
 * @param retryTemplate the template.
 * @since 2.0.6
 * @see #setReplyRecoveryCallback(RecoveryCallback)
 * @see AbstractAdaptableMessageListener#setRetryTemplate(RetryTemplate)
 */
public void setRetryTemplate(RetryTemplate retryTemplate) {
    this.retryTemplate = retryTemplate;
}

/**
 * Set a {@link RecoveryCallback} to invoke when retries are exhausted. Added to each
 * message listener adapter. Only used if a {@link #setRetryTemplate(RetryTemplate)
 * retryTemplate} is provided.
 * @param recoveryCallback the recovery callback.
 * @since 2.0.6
 * @see #setRetryTemplate(RetryTemplate)
 * @see AbstractAdaptableMessageListener#setRecoveryCallback(RecoveryCallback)
 */
public void setReplyRecoveryCallback(RecoveryCallback<?> recoveryCallback) {
    this.recoveryCallback = recoveryCallback;
}

И вы правы: вы можете использовать start()/stop()также.По этой причине вам нужно ввести боб RabbitListenerEndpointRegistry и использовать его:

/**
 * Return the {@link MessageListenerContainer} with the specified id or
 * {@code null} if no such container exists.
 * @param id the id of the container
 * @return the container or {@code null} if no container with that id exists
 * @see RabbitListenerEndpoint#getId()
 * @see #getListenerContainerIds()
 */
public MessageListenerContainer getListenerContainer(String id) {

Чтобы получить доступ к соответствующему контейнеру слушателя для ваших @RabbitListener и stop() или start(), в соответствии с вашимлогика.

...