1

spring-cloud のConfig Serverを使用しています。アプリを再起動せずにアプリの構成を更新したい。

これは私のシナリオです:

1) gitに保存された application.yml の単一の構成

job:
 demo:
  testMessage: 'My ID is 123'

2)クライアントのアクチュエーターとコントローラーの@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 Integration を使用した 1 つのフロー:

@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 の特定の動作がありますか?

ありがとう。

4

1 に答える 1

3

@Configurationクラスを配置すると、そのクラスで@RefreshScope宣言されたBeanがそのスコープに配置されるとは思いません。

さらに、IntegrationFlow @Bean内部で多数の Bean が生成され、それらは確かにそのスコープには入れられません。統合フローを「リフレッシュ」しようとしないでください。実行時の問題が発生する可能性があります。

代わりに、フローとは別のクラスにプロパティを配置し、それをDemoHandler @Bean.

于 2016-08-22T15:07:37.097 に答える