2011-10-02 5 views
1

우리는 엔터프라이즈 응용 프로그램의 구성 서비스로 spring을 사용할 계획입니다.spring context.refresh() 및 동시 액세스

이 부분은 봄 참고 안내서 및 기타 블로그에서 잘 설명되어 있습니다. 기본적으로 속성 파일과 context : property-placeholder를 사용하여 응용 프로그램에서 차례로 사용되는 bean에 & 값을 채울 계획입니다.

경우에 따라 등록 정보 파일이 변경되고 해당 이벤트에서 변경된 값을 반영하도록 bean을 원할 수 있습니다. 나는 ApplicationContext.refresh()가 빈과 그 설정 값을 새로 고치는 방법이라는 것을 이해한다. ApplicationContext.refresh()는 매력처럼 작동했습니다. 컨텍스트가 갱신 될 때

<context:property-override location="file:///d:/work/nano-coder/quickhacks/src/main/resources/myproperties.properties"/> 

<bean id="myconfig" class="org.nanocoder.quickhacks.config.MyPropertyBean"> 
    <property name="cacheSize" value="${registry.ehcache.size}"/> 
    <property name="httpHostName" value="${url.httpHostName}"/> 
    <property name="httpsHostName" value="${url.httpsHostName}"/> 
    <property name="imageServers"> 
     <list> 
      <value>${url.imageserver1}</value> 
      <value>${url.imageserver2}</value> 
      <value>${url.imageserver3}</value> 
     </list> 
    </property> 

</bean> 

그러나, I는 ApplicationContext.getBean 해당 동시 통화() 또는 콩 어떠한 게터 동작 잠재적 인해 IllegalStateException이 또는 BeanCreationException 실패 알았다.

value = context.getBean("myconfig", MyPropertyBean.class).getHttpHostName(); 

질문

  1. ()는 다른 동시 통화에 영향을주지 않는 것이 가능 통화 context.refresh하는 것입니다
  2. context.refresh()가 동시 접근을 방해 할 수있는 경우 이러한 상황을 피하기위한 전략이 필요합니다.

귀하의 지침에 크게 감사하겠습니다.

답변

1

당신이 할 수있는 일은 설정 서비스 주위에 래퍼를 만들고 기존 컨텍스트를 새로 고치는 대신 새 컨텍스트를 만드는 것입니다. 새로운 것이 준비되면, 이전 것을 대신 사용하십시오.

class MyConfig { 
    private ApplicationContext context; 

    public ApplicationContext getContext() { 
    return context; 
    } 

    public void refresh() { 
    context = new FileSystemXmlApplicationContext(..) 
    } 
} 
:

나는이 설정 관리를위한 최선의 선택이지만 코드는 (적어도 어떤 스프링 의존성과의 인터페이스를 소개 할 수 나중에 하나에) 같이 할 수 있는지 확실하지 않다

관련 문제