1

私はコンフィグレーションサーバをspring-cloudから使用しています。私はそれを再起動することなくアプリケーションの設定を更新したい。 application.ymlでルートリフレクション内でコンフィグリフレッシュが機能しない

1)単一の構成、クライアントと注釈@RefreshScopegitの

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

2)アクチュエータに保存されている:

この

は私のシナリオですコントローラ内にあります。春の統合と

@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)つの流れ:

@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)I設定を更新し

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

5 gitのためにプッシュする)を実行し、リフレッシュ

curl -d{} http://localhost:8002/refresh 

コントローラへの残りの呼び出しでは、everyth設定が更新されました。

["config 1 is: My ID is 789"] 

しかし、設定が更新されなかった統合フローへのREST呼び出し、中:

[LOGGING DEMO] My ID is 123 

設定をリフレッシュするために阻止された豆のいくつかの特定の振る舞いがありますか?

ありがとうございました。

答えて

3

@RefreshScope@Configurationクラスを入れると、そこに宣言されているBeanがそのスコープに置かれるとは思いません。

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

代わりに、フローとは別のクラスにプロパティを配置し、DemoHandler@Beanに注入する必要があります。

+0

すてきな説明ゲイリーありがとう。 –

+1

さらに、 'job.demo'キーを専用の' @ConfigurationProperties'クラスに入れると、 '@ Value'に' @ RefreshScope'は必要ありません。 – spencergibb

関連する問題