복붙노트

[SPRING] Spring : 투명한 런타임 변경 가능 속성 구성 수행 방법

SPRING

Spring : 투명한 런타임 변경 가능 속성 구성 수행 방법

Spring은 구성을 위해 Spring Bean에 타임 아웃, JDBC URL 등의 값을 주입하는 좋은 메커니즘 인 PropertyPlaceholderConfigurer를 가지고 있습니다. 런타임에 변경 될 수있는 구성 값을 처리하는 합리적인 방법이 있습니까?

업데이트 : Spring 3.1에는 PropertySources를 통해 데이터베이스와 같은 비 정적 구성 소스를 포함시키는 좋은 방법이 있습니다. 일부 ApplicationContext는 기본적으로 구성 값 변경을 처리 할 수있는 새로 고침 메커니즘을 제공합니다. 그러나 먼저 응용 프로그램을 중지 한 다음 모든 빈을 새로 작성한 다음 응용 프로그램 컨텍스트를 다시 시작합니다. 그러나 우리의 목적을 위해 서버가 현재 실행중인 요청을 올바르게 처리 할 수 ​​있도록이 작업을 투명하게 수행 할 방법이 필요합니다.

이렇게하는 또 다른 아이디어는 구성이 변경 될 때 새로운 개체를 만드는 사용자 지정 Scope입니다. 안타깝게도 Scope에 제공된 ObjectFactory는 사전 처리 된 Bean 정의를 사용하므로 placeholder가 구성에서 다시 읽히지 않습니다. 따라서 생성 된 객체는 동일한 구성을 갖습니다. :-(

해결법

  1. ==============================

    1.불행히도 속성 파일의 구성은 정적이며 시작시 발생합니다. 내가 일반적으로하는 일은 jmx를 통해 동적 속성을 노출하는 것입니다.

    불행히도 속성 파일의 구성은 정적이며 시작시 발생합니다. 내가 일반적으로하는 일은 jmx를 통해 동적 속성을 노출하는 것입니다.

    @ManagedResource
    @Service
    public class BusinessService {
    
        @ManagedAttribute
        private int age;
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void businessMethod() {
            //use age...
        }
    
    }
    

    다음을 추가하십시오.

    <context:mbean-export/>
    

    귀하의 구성에. 이제 jconsole 또는 다른 JMX 클라이언트를 통해 해당 속성에 액세스하고 변경할 수 있습니다. 23.3.2 소스 레벨 메타 데이터 사용하기 (JDK 5.0 주석).

  2. ==============================

    2.다음은 좀 이상하지만 작동합니다. 구성 업데이트가 발생할 때마다 해당 범위에서 생성 된 모든 bean을 버리는 reconfigurable이라는 사용자 정의 범위를 만듭니다. 따라서 설정 변경 후에 신선한 bean이 생성됩니다.

    다음은 좀 이상하지만 작동합니다. 구성 업데이트가 발생할 때마다 해당 범위에서 생성 된 모든 bean을 버리는 reconfigurable이라는 사용자 정의 범위를 만듭니다. 따라서 설정 변경 후에 신선한 bean이 생성됩니다.

    실제 $ {} 문법과 PropertyOverrideConfigurer 둘 다에 대한 값이 BeanDefinition에서 영구적으로 고정되어있는 것처럼 보이기 때문에 스프링 표현식 언어를 통해 실제 구성 값을 검색해야합니다. someProperty라는 재구성 가능한 속성을 가진 빈에 대한 빈 선언은 다음과 같다.

    <bean class="blablu.Testbean" scope="reconfigurable"
      p:someProperty="#{ config['configexplicit']}">
      <aop:scoped-proxy />
    </bean>
    

    이 빈을 사용하는 빈이 항상 사용자 정의 된 범위에서 가장 새로 구성된 빈을 검색하도록 aop : scoped-proxy를 사용해야한다.

    @Value를 사용하여 속성을 선언하는 방법도 있습니다. 구성 요소 검사를 사용하는 경우 주석을 사용하여 범위를 선언해야합니다.

    @Scope(value="reconfigurableScope", proxyMode=ScopedProxyMode.TARGET_CLASS)
    

    세부 사항을 고려하는 경우 : 범위의 기본 아이디어는 다음과 같습니다.

    public class ReconfigurableScope implements Scope {
    
        private final Map<String, Object> nameToObjectMap = new ConcurrentHashMap<String, Object>();
    
        public Object get(final String name, final ObjectFactory<?> objectFactory) {
            Object bean = nameToObjectMap.get(name);
            if (null == bean) {
                bean = objectFactory.getObject();
                nameToObjectMap.put(name, bean);
            }
            return bean;
        }
    
        // called from outside on each configuration change
        public void update(final ConfigurationObservable observable, final Object arg) {
            nameToObjectMap.clear();
        }
    
    }
    

    일부 스레드 안전성 및 정리 작업을 추가하면 : 제거 된 콩은 나중에 약간의 응용 프로그램 컨텍스트에서 삭제해야합니다.

  3. ==============================

    3.여기서 수행하고자하는 것을 실행하는 예가 있습니다 : https://github.com/ldojo/spring-cloud-config-examples

    여기서 수행하고자하는 것을 실행하는 예가 있습니다 : https://github.com/ldojo/spring-cloud-config-examples

    Spring Cloud Config Server와 클라이언트 서비스가 Spring Cloud Bus를 통해 어떻게 통신 할 수 있는지를 보여주고, Config Server의 Repo에서 구성이 변경되면 런타임에 클라이언트의 구성 속성이 변경 될 수 있습니다.

  4. ==============================

    4.효과적인 런타임 재구성을 위해 Spring의 Cloud Config 프로젝트를 사용할 수 있습니다. 이 배열에서는 구성 값을 포함하는 git 저장소와 같은 구성 저장소가 있습니다. 그런 다음 해당 저장소 앞에 구성 서버를 배치하십시오. 이 서버는 푸시가 백업 저장소에 발생할 때마다 업데이트됩니다. 마지막으로 앱은 해당 구성 서버의 클라이언트가되어 새로운 구성을 가져옵니다. 자세한 내용은 Spring Cloud를 확인하십시오.

    효과적인 런타임 재구성을 위해 Spring의 Cloud Config 프로젝트를 사용할 수 있습니다. 이 배열에서는 구성 값을 포함하는 git 저장소와 같은 구성 저장소가 있습니다. 그런 다음 해당 저장소 앞에 구성 서버를 배치하십시오. 이 서버는 푸시가 백업 저장소에 발생할 때마다 업데이트됩니다. 마지막으로 앱은 해당 구성 서버의 클라이언트가되어 새로운 구성을 가져옵니다. 자세한 내용은 Spring Cloud를 확인하십시오.

  5. from https://stackoverflow.com/questions/9974246/spring-how-to-do-transparent-runtime-changeable-property-configuration by cc-by-sa and MIT license