我仍在使用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,但不会应用乘数。根据文档(here和here),密钥是驼峰式的,但是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中错误地设置了配置道具,还是问题出在哪里?
答案 0 :(得分:2)
spring-retry ExponentialBackOfPolicy
的计算间隔有一个上限,由maxInterval
定义。
Spring Cloud Stream将其公开为属性backOffMaxInterval。
巧合的是,默认值为10秒。
您还需要设置该属性。我看到您在@Bean
版本中这样做。
我对按键的所有不同方式感到困惑,但这是另一回事。
Java *Properties
类上的属性名称当然是驼峰式的。
属性名称的转换,例如back-off-max-interval
至backOffMaxInterval
是Spring Boot的功能。