我可以为JMSTemplate生成器

时间:2018-05-30 20:00:48

标签: spring jms spring-integration

如果代理已关闭/无法访问,则Spring JMS生成器应在重试之前等待可配置的持续时间。 是否可以在DefaultMessageListenerContainers中提供类似FixedBackOff的配置?

问题是我看到我的生产者正在无限地尝试连接到ActiveMQ代理,但生产者连接没有有效的证书链并引发SSL错误。此连接重试没有中断,并在几秒钟内生成一堆日志条目。 这只是SSL不正确的情况,但在生产过程中,代理会因维护而关闭,然后生产者应在连接重试之间等待。

或者有没有办法在发布消息之前检查JMS Producer连接状态。

环境:Spring JMS。 ActiveMQ的

1 个答案:

答案 0 :(得分:1)

DefaultMessageListenerContainer确实有一个配置选项:

/**
 * Specify the {@link BackOff} instance to use to compute the interval
 * between recovery attempts. If the {@link BackOffExecution} implementation
 * returns {@link BackOffExecution#STOP}, this listener container will not further
 * attempt to recover.
 * <p>The {@link #setRecoveryInterval(long) recovery interval} is ignored
 * when this property is set.
 * @since 4.1
 */
public void setBackOff(BackOff backOff) {
    this.backOff = backOff;
}

默认情况下是这个:

private BackOff backOff = new FixedBackOff(DEFAULT_RECOVERY_INTERVAL,  Long.MAX_VALUE);

Long.MAX_VALUE参数代表maxAttempts

<强>更新

如果我们谈论的是JmsTemplate,则必须从客户端代码的角度来完成重试逻辑。这是一个被动组件,没有任何后台线程在DefaultMessageListenerContainer的情况下做一些工作。

为了进行基于客户端的重试,我们建议使用Spring Retry项目。要配置RetryTemplateRetryPolicy。然后,您只需使用JmsTemplate包装器调用RetryTemplate.execute() - 并根据策略重试任何错误。