【问题标题】:Spring Amqp - Dynamically Disable/Enable RabbitListener while DB Batch runningSpring Amqp - 在 DB Batch 运行时动态禁用/启用 RabbitListener
【发布时间】:2019-05-03 17:18:58
【问题描述】:

我们有这样的场景,消息从 Amqp 队列中取出并写入我们的数据库 - 但是,在计划的数据库批处理运行期间,数据库不可用并且我们无法写入,因此我们希望消息保留在在这些窗口期间排队。

我正在尝试确定处理此问题的最佳方法 - 只需在 @RabbitListener 方法中抛出异常以(重复)重新排队消息或使用 Spring 调度程序尝试停止/启动侦听器(我看到SimpleMessageListenerContainer 有停止/启动方法)。

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

【问题讨论】:

    标签: spring-amqp


    【解决方案1】:

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

    查看AbstractRabbitListenerContainerFactoryJavaDocs:

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

    根据您的逻辑访问适合您的@RabbitListener 和stop() 或start() 的侦听器容器。

    【讨论】:

    • 感谢您的帮助 Artem - 尚未实施,但看起来停止/开始路线更符合我们需要做的事情。
    • 太棒了!所以,是时候接受答案了:stackoverflow.com/help/someone-answers!
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多