如何使用@RefreshScope刷新Spring Integration Poller?

时间:2018-08-17 19:50:09

标签: spring spring-boot spring-integration spring-cloud spring-cloud-config

我有一个使用Spring Cloud Config刷新其属性的Spring Boot应用程序。我可以轻松地使用@RefreshScope刷新控制器,但不确定如何才能poller重新启动Spring Integration作业。

我的integration-config.xml:

<context:property-placeholder location="file:///C:/workspace/config/tasky-dev.properties" />

<int:inbound-channel-adapter ref="tasksService" method="requestAllTasks" channel="initTimestampChannel">
    <int:poller fixed-rate="${start.task.rate}"></int:poller>
</int:inbound-channel-adapter>

如果我更改了start.task.rate,然后按了/refresh,执行器将检测到更改,但是我的poller却没捡到任何东西。有什么办法为其定义某种@RefreshScope

我的tasky-dev.properties

start.task.rate=600000

我的Application.java:

@SpringBootApplication
@EnableConfigServer
@ImportResource("classpath:integration-config.xml")
@EnableSwagger2
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

}

=======

更新:

尝试通过设置PeriodicTrigger来解决Artem的问题。刷新作用域,但仅在调用轮询器时(一旦fixedRate持续时间过去)才刷新:

@RefreshScope
@Bean
public PeriodicTrigger refreshablePeriodicTrigger() {
    PeriodicTrigger periodicTrigger = new PeriodicTrigger(fixedRate);
    periodicTrigger.setFixedRate(true);
    return periodicTrigger;
}

然后:

<int:inbound-channel-adapter ref="tasksService" method="requestAllTasks" channel="initTimestampChannel">
    <int:poller trigger="refreshablePeriodicTrigger"></int:poller>
</int:inbound-channel-adapter>

1 个答案:

答案 0 :(得分:1)

那么,方便的<poller>本质上注册了Trigger使用的TaskScheduler.schedule(Runnable task, Trigger trigger)对象。

我建议您在PeriodicTrigger的某个@Configuration中注册@RefreshScope bean,并在<poller>定义中使用它,而不要使用fixed-rate属性