2017-12-08 20 views
2

구성을 제공하기 위해 Spring 클라우드 구성을 사용하도록 설정 한 응용 프로그램을 가지고 있으며 구성 서버가 변경 이벤트를 내 응용 프로그램에 게시 할 수 있도록 모니터를 사용하도록 설정해야합니다. 구성이 올바르게 업데이트되지만 구성 변경시 알림을 받고 새로운 구성을 기반으로 일부 사용자 지정 논리를 실행할 수 있습니다.스프링 클라우드 설정을 새로 고친 후 어떻게 커스텀 로직을 실행할 수 있습니까?

는 내가 구성에 someValue와를 변경할 때 내 설정 서버에서

@Configuration 
@RefreshScope 
@ConfigurationProperties(prefix = "my.prefix") 
public class MyConfig { 
    private Map<String, MyObject> configs; 
    private String someValue; 

    public Map<String, MyObject> getConfigs(){...} 
    public void setConfigs(){...} 

    public String getSomeValue(){...} 
    public void setSomeValue(){...} 
} 
... 
public class MyObject { 
    private String field1; 

    public String getField1() {...} 
    public void setField1() {...} 
} 

그리고 이것은 지금

my: 
    prefix: 
    configs: 
     TEST: 
     field1: "testValue" 
    someValue: "test" 

을 application.yml이 구성 객체를 가지고 있고, 설정 서버는 새로 고침을 발행하고, 그것을 setSomeValue()를 호출하고 값을 새 값으로 업데이트합니다. setSomeValue()에 내 사용자 지정 논리를 추가 할 수 있으며 정상적으로 작동합니다. 그러나 구성에서 항목을 업데이트하거나 추가/제거 할 때 setConfigs() 또는 setField1()을 호출하지 않는 것 같습니다.

EnviornmentChangeEvents, RefreshEvents 또는 RefreshScopeRefreshedEvents에 대한 리스너 등록을 시도했지만 값이 업데이트되거나 전혀 트리거되지 않기 전에 트리거됩니다. 또한 @PreDestroy 및 @PostConstruct 메서드에 논리를 추가하려고 시도했지만 PreDestroy 만 호출되고 구성이 업데이트되기 전에 호출됩니다. 나는 또한 InitializingBean을 구현하고 내 논리를 afterPropertiesSet()에 두었지 만 결코 호출되지 않는다.

이 구성이 업데이트되면 어떻게 알림을받을 수 있습니까?

답변

1

RefreshScopeRefreshedEvent Listener를 사용하면 구성이 업데이트 될 때 알림을받을 수 있습니다.

다음 예

나를 위해 작동합니다

구성 :

@Configuration 
public class Config { 
    @Bean 
    @RefreshScope 
    public A aBean() { 
     return new A(); 
    } 

    @Bean 
    public RefreshScopeRefreshedListener remoteApplicationEventListener(A aBean) { 
     return new RefreshScopeRefreshedListener(aBean); 
    } 

} 

그리고 청취자 :

public class RefreshScopeRefreshedListener implements ApplicationListener<RefreshScopeRefreshedEvent> { 
    private A aBean; 

    public RefreshScopeRefreshedListener(A abean) { 
     this.aBean = abean; 
    } 

    @Override 
    public void onApplicationEvent(RefreshScopeRefreshedEvent event) { 
     System.out.println(aBean.getValue()); 

    } 

} 

그것은 항상 구성의 새로운 가치를 인쇄 할 수 있습니다.

이미이 수신기를 사용해 본 적이 있다면 잘 등록되어 있습니까? 빈은 올바르게 생성 되었습니까?