Spring Amqp-运行DB Batch时动态禁用/启用RabbitListener

时间:2019-05-03 17:18:58

标签: spring-amqp

在这种情况下,消息将从Amqp队列中拉出并写入到数据库中-但是,在计划的DB批处理运行期间,该数据库不可用并且我们无法写入,因此我们希望消息保留在在这些窗口中排队。

我正在尝试确定解决此问题的最佳方法-只需在@RabbitListener方法中引发异常以(重复)重新排队消息,或使用Spring调度程序尝试停止/启动侦听器(我知道SimpleMessageListenerContainer具有停止/启动方法)。

关于最佳(或更好)方法的任何建议吗?

1 个答案:

答案 0 :(得分:0)

要考虑的另一种方法是侦听器的回复功能。

查看AbstractRabbitListenerContainerFactory JavaDoc:

/**
 * 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 bean并使用它:

/**
 * 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) {

要根据您的逻辑访问@RabbitListenerstop()start()的适当的侦听器容器。