Spring Cloud Stream Rabbit的退避设置

时间:2018-08-19 09:29:05

标签: java spring spring-boot spring-rabbitmq spring-messaging

我仍在使用Rabbitmq和Spring Cloud消息传递设置示例消息传递系统,并且遇到错误(?),或者我误解了文档。 (使用spring-boot版本2.0.3.RELEASE)

在此示例中,我需要以下设置

  spring:
    cloud:
      stream:
        rabbit:
          bindings:
            foo:
              consumer:
                auto-bind-dlq: true
        instanceCount: 2
        instanceIndex: 0
        bindings:
          foo:
            destination: foo
            group: fooGroup
            consumer:
              maxAttempts: 4
              backOffInitialInterval: 10000
              backOffMultiplier: 10.0 
          fooChannel:
            destination: foo

这个问题最有趣的部分是spring.cloud.stream.bindings.foo.consumer部分,在这里我设置了4个maxAttempts,初始回退间隔10s和乘数10。

将应用maxAttempts和初始Interval,但不会应用乘数。根据文档(herehere),密钥是驼峰式的,但是backOffInitialInterval似乎也像back-off-initial-interval一样适用。我对键的所有不同方式感到困惑,但这是另一回事了。

我已经尝试了所有可能的书写方式backOffMultiplier,但没有得到应用,消息每10秒发送一次。

现在,要测试真正的错误,我设置了@Bean并手动配置了RetryTemplate

@Bean
    RetryTemplate retryTemplate() {
        RetryTemplate r = new RetryTemplate();

        ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
        exponentialBackOffPolicy.setInitialInterval(10000);
        exponentialBackOffPolicy.setMultiplier(10.0);
        exponentialBackOffPolicy.setMaxInterval(100000);
        r.setBackOffPolicy(exponentialBackOffPolicy);

        SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
        simpleRetryPolicy.setMaxAttempts(4);
        r.setRetryPolicy(simpleRetryPolicy);
        return r;

    }

使用bean,一切都将正确应用,并且所有设置都得到遵守。

是我在application.yml中错误地设置了配置道具,还是问题出在哪里?

1 个答案:

答案 0 :(得分:2)

spring-retry ExponentialBackOfPolicy的计算间隔有一个上限,由maxInterval定义。

Spring Cloud Stream将其公开为属性backOffMaxInterval

巧合的是,默认值为10秒。

您还需要设置该属性。我看到您在@Bean版本中这样做。

  

我对按键的所有不同方式感到困惑,但这是另一回事。

Java *Properties类上的属性名称当然是驼峰式的。

属性名称的转换,例如back-off-max-intervalbackOffMaxInterval是Spring Boot的功能。