配置刷新在路由声明中不起作用
Config refresh isn't working inside route declaration
我正在使用来自 spring-cloud 的 Config Server。我希望刷新应用程序的配置而不必重新启动它。
这是我的场景:
1) application.yml中的单个配置,存储在git
中
job:
demo:
testMessage: 'My ID is 123'
2) 客户端中的 Actuator 和控制器中的注释 @RefreshScope.
@RefreshScope
@Component
@RestController
public class DemoController {
@Value("${job.demo.testMessage}")
String testMessage;
@RequestMapping(value = "/", produces = "application/json")
public List<String> index() {
List<String> env = Arrays.asList(
"config 1 is: " + testMessage
);
return env;
}
}
3) 具有 Spring 集成的一个流程:
@RefreshScope
@Slf4j
@Setter
@Component
@ConfigurationProperties(prefix = "job.demo")
public class DemoFlow {
private String testMessage;
@Bean
public IntegrationFlow putDemoModelFlow() {
return IntegrationFlows.from(Http.inboundChannelAdapter("/demoFlow"))
.handle(new DemoHandler())
.handle(m -> log.info("[LOGGING DEMO] {}" , m.getPayload()))
.get();
}
private class DemoHandler implements GenericHandler {
@Override
public String handle(Object payload, Map headers) {
return new StringBuilder().append(testMessage)
.append(" ").toString();
}
}
}
4) 我更新配置并推送到 git
job:
demo:
testMessage: 'My ID is 789'
5) 运行刷新
curl -d{} http://localhost:8002/refresh
在对控制器的其余调用中,一切正常,配置已更新。
["config 1 is: My ID is 789"]
但是在其余的集成流程调用中,配置没有更新:
[LOGGING DEMO] My ID is 123
bean 的某些特定行为正在阻止刷新配置?
谢谢。
我不相信将 @Configuration
class 放入 @RefreshScope
会将其中声明的 bean 放入该范围。
此外,IntegrationFlow
@Bean
会在内部生成许多 bean,它们肯定不会放在该范围内。您不应尝试 "refresh" 集成流程,这可能会导致运行时问题。
相反,您应该将 属性 放在与流程分开的 class 中,然后将其注入您的 DemoHandler
@Bean
.
我正在使用来自 spring-cloud 的 Config Server。我希望刷新应用程序的配置而不必重新启动它。
这是我的场景:
1) application.yml中的单个配置,存储在git
中job:
demo:
testMessage: 'My ID is 123'
2) 客户端中的 Actuator 和控制器中的注释 @RefreshScope.
@RefreshScope
@Component
@RestController
public class DemoController {
@Value("${job.demo.testMessage}")
String testMessage;
@RequestMapping(value = "/", produces = "application/json")
public List<String> index() {
List<String> env = Arrays.asList(
"config 1 is: " + testMessage
);
return env;
}
}
3) 具有 Spring 集成的一个流程:
@RefreshScope
@Slf4j
@Setter
@Component
@ConfigurationProperties(prefix = "job.demo")
public class DemoFlow {
private String testMessage;
@Bean
public IntegrationFlow putDemoModelFlow() {
return IntegrationFlows.from(Http.inboundChannelAdapter("/demoFlow"))
.handle(new DemoHandler())
.handle(m -> log.info("[LOGGING DEMO] {}" , m.getPayload()))
.get();
}
private class DemoHandler implements GenericHandler {
@Override
public String handle(Object payload, Map headers) {
return new StringBuilder().append(testMessage)
.append(" ").toString();
}
}
}
4) 我更新配置并推送到 git
job:
demo:
testMessage: 'My ID is 789'
5) 运行刷新
curl -d{} http://localhost:8002/refresh
在对控制器的其余调用中,一切正常,配置已更新。
["config 1 is: My ID is 789"]
但是在其余的集成流程调用中,配置没有更新:
[LOGGING DEMO] My ID is 123
bean 的某些特定行为正在阻止刷新配置?
谢谢。
我不相信将 @Configuration
class 放入 @RefreshScope
会将其中声明的 bean 放入该范围。
此外,IntegrationFlow
@Bean
会在内部生成许多 bean,它们肯定不会放在该范围内。您不应尝试 "refresh" 集成流程,这可能会导致运行时问题。
相反,您应该将 属性 放在与流程分开的 class 中,然后将其注入您的 DemoHandler
@Bean
.