Spring云流互斥属性问题

Spring cloud stream mutually exclusive property issue

我有 application.yml 配置,即

cloud:
    stream:
      poller:
        # Cron for polling data.
        cron: 0 0/30 * * * *
        ........

我遇到了类似

的错误
Description:

The following configuration properties are mutually exclusive:

    spring.integration.poller.cron
    spring.integration.poller.fixed-delay
    spring.integration.poller.fixed-rate

However, more than one of those properties has been configured at the same time:

    spring.integration.poller.cron
    spring.integration.poller.fixed-delay


Action:

Update your configuration so that only one of the mutually exclusive properties is configured.

即使我没有添加 fix-delay 也显示我已经添加了它。

我看到如果 属性 不存在,PollerConfigEnvironmentPostProcessor class 会添加 fixed-delay。那么如何使用 cron 表达式呢?

//TODO Must remain after removal of deprecated code above in the future
        streamPollerProperties.putIfAbsent(INTEGRATION_PROPERTY_PREFIX + "fixed-delay", "1s");
        streamPollerProperties.putIfAbsent(INTEGRATION_PROPERTY_PREFIX + "max-messages-per-poll", "1");

我还检查了 spring 集成轮询器属性而不是 spring 云流轮询器,因为它已被弃用但得到相同的错误

 integration:
    poller:
      cron: 0 0/30 * * * *

之前使用 spring 云版本 2020.0.2,它运行良好。一旦我将 spring 云版本更新为 2021.0.1,就会开始出错

这是错误。那:

streamPollerProperties.putIfAbsent(INTEGRATION_PROPERTY_PREFIX + "fixed-delay", "1s");
如果还没有 spring.integration.poller.fixed-delayspring.integration.poller.cron

必须是有条件的。

作为解决方法,我建议实施 EnvironmentPostProcessor,如下所示:

public class RemoveStreamPollerEnvironmentPostProcessor implements EnvironmentPostProcessor {

    @Override 
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        environment.getPropertySources().remove("spring.integration.poller");
    }

}

这样,与 Spring Cloud Stream 相关的所有 spring.integration.poller. 属性将从环境中删除。但是那些基于 spring.integration.poller. 手动配置的那些仍然存在。

因此你的:

spring:
  integration:
    poller:
      cron: 0 0/30 * * * *

会好的。

注意:EnvironmentPostProcessor 必须在 spring.factories 中注册。