검색결과 리스트
properties 리로딩에 해당되는 글 1건
- 2014.01.17 [springframework] confing properties re-loading 기능 (3)
글
[ If you think that is useful, please click the finger on the bottom~^-^good~ ]
by ace-T
[springframework] confing properties re-loading 기능
1. 배 경
2. 구 현
3. 결 과
4. 참조 사이트
<< 배 경 >>
Spring을 사용하면서 config properties 파일이 WAS의 재가동 없이 반영 되어야 하는 경우가 있다.
찾아보았더니 org.apache.commons.configuration.PropertiesConfiguration를 통해서 구현 할 수 었다!!
<< 구 현 >>
1) spring의 context-properties.xml(properties location이 있는 context) 에서 bean을 만든다.
- context-properties.xml 부분
<context:property-placeholder location="classpath:properties/config.properties"/> 이 부분 추가!! value에서 path부분에서 너무 많은 소요를 하였다..ㅠ.ㅠ...classpath: 를 넣었었다... <bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration"> <constructor-arg type="java.lang.String" value="properties/config.properties" /> <property name="reloadingStrategy" ref="reloadingStrategy" /> </bean> <bean id="reloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" /> |
- bean이 등록이 되었다면(WAS 기동 시 잘 읽어들인다면), @Autowired를 하여 사용 하면 된다.
@Autowired private PropertiesConfiguration runtimeProperties; public String getConfigProperites() { return (String)runtimeProperties.getProperty("config.test.acet"); } |
<< 결과 >>
테스트로 2가지를 해보았다.
@Value와 @Autowired private PropertiesConfiguration 2가지 버전으로 테스트를 하였다.
[ 결과 ] getConfigProperites()=>486486 value--->1000004 |
config.properties의 내용은 아래와 같다.
# properties test config.test.acet=1000004 |
소스에서는
Value는 @Value("${config.test.acet}")
private String name; 로 가져와서 찍어주었고,
PropertiesConfiguration 는 위의 소스 처럼 가져와서 찍어주었다.
System.out.println("getConfigProperites()=>"+getConfigProperites());
System.out.println("value--->"+name);
WAS는 Tomcat 6.0을 사용하였고, local 에서 테스트를 위해 아래와 같이 설정을 해주어야 한다.
단, server.xml에서 다음과 같이 수정을 해줘야 한다.(very important~!!!)
<Host appBase="webapps" autoDeploy="false" name="10.214.184.86" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"> <Context docBase="ktdsOssDevPlay" path="/" reloadable="false" source="org.eclipse.jst.jee.server:ktdsOssDevPlay"/></Host> |
그런 다음 tomcat에서 Use workspace metadata를 사용하였으며 (Server 찍고~ 마우스 우클릭에서 Properties에서 선택 가능 )
C:\ACET\workingSpace\.metadata\.plugins\org.eclipse.wst.server.core\tmp3\wtpwebapps\ktdsOssDevPlay\WEB-INF\classes\properties에서 즉, 배포 된 녀석(config.properties)을 수정하였다. 486486으로^-^/
참조 사이트는 너무 이것저것 봐서...대충 띄워져있는 것만 써놨다. 그냥 구글링을 하시면 됩니다~
<< 참조 사이트 >>
1) http://commons.apache.org/proper/commons-configuration/apidocs/org/apache/commons/configuration/PropertiesConfiguration.html#PropertiesConfiguration(java.io.File)
2) https://jira.springsource.org/browse/SPR-4714
3) http://blog.naver.com/PostView.nhn?blogId=leehyogun&logNo=160766551
4) http://goodwilldd.blogspot.kr/2012/09/spring-properties-reload_13.html
아! PropertiesConfiguration.class를 보면 아래와 같다.
public class PropertiesConfiguration extends AbstractFileConfiguration { 블라블라~중에서
발췌한 내용이다. 여기서 보아야 할 것은 PropertiesConfiguration의 bean을 만들 때 생성자를 만드는 부분이 있는데 그 생성자를 만들 때 어떻게 생성 하는지이다.
File, String, Url 등등 을 파라미터로 받아서 생성이 가능하다는 것이다.
더보기
- END -
'OpenSource > Spring MVC' 카테고리의 다른 글
설정
트랙백
댓글
-
행인 2014.11.20 11:44 신고
안녕하세요. Spring 환경에서 properties 를 톰캣 재기동 없이 변경하는 방법에 대해 찾다가 오게 되었는데요.글에서 설명해주신대로 xml 에 내용 세팅하고 @Autowired 로 프로퍼티에서 데이터를 잘 꺼내와서 사용하고 있는데 톰캣 기동중 프로퍼티를 변경하면 변경내용을 읽어오질 못하고 있습니다.
톰캣에 대한 설정도 글에 쓰신대로 변경해주었고요.. 뭔가 에러가 나는게 아니라 어디가 잘못되었는지 어느걸 추가로 확인해야하는지도 모르는 상태 이고요 ㅜ_ㅡ
제가 테스트 한 사항은 웹화면에서 파일을 업로드 하는데 업로드 경로를 프로퍼티에 지정해주고 업로드 요청 시 해당프로퍼티에서 경로를 가져와 등록합니다.
로컬에서 톰캣 기동으로 테스트를 진행하였고 처음 업로드 시 경로와 도중에 프로퍼티에서 업로드 경로 수정 후 재업로드 시 경로를 확인하였는데 바뀐 경로가 적용이 안되더라고요...
뭘 확인해야할지 감도 안잡히는데 어떻게 하면 좋을지.. -
행인 2014.11.20 11:48 신고
실제 소스상 설정 내용은 아래와 같습니다.
***** context-common.xml *******
<bean id="runtimeProperties" class="org.apache.commons.configuration.PropertiesConfiguration">
<constructor-arg type="java.lang.String" value="setting.properties" />
<property name="reloadingStrategy" ref="reloadingStrategy" />
</bean>
<bean id="reloadingStrategy" class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy" />
해당 파일에 위처럼 설정내용을 세팅하였고 해당파일은 context-root.xml 파일에
<beans:import resource="context-common.xml" /> 로 지정되어있습니다.
해당 xml 은 web.xml 에 지정한 상태이고
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/config/spring/context-root.xml
</param-value>
</context-param>
실제 서버에서 사용은 ServiceImpl 단에서
@Autowired
PropertiesConfiguration propertiesConfiguration;
오토와이드 선언 후
propertiesConfiguration.getString("FILE_ROOT"
이런식으로 파일경로를 가져와 사용하고 있습니다.
경로는 잘 가져옵니다만 톰캣 기동 중 경로를 수정하면 수정 된 경로를 가져오지 못하고 있습니다..-
String Ace-T 2014.11.20 16:42 신고
안녕하세요!
우선은 context-common.xml 에서 setting.properties를 가져와서 사용하시는건가요?
<context:property-placeholder location="classpath:properties/setting.properties"/> <- 요부분이 보이질 않네요
그리고 스프링쪽 셋팅중에 <beans:import resource="context-common.xml" /> 이부분을 context-root.xml 파일에서 import하지마시고 순서가 중요하니!
스프링컨테이너에 올리실 때 저부분을 아래처럼 web.xml올라갈때 load시켜보세요
<servlet>
<servlet-name>AcetTest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext-servlet.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
classpath:context-common.xml
</param-value>
</context-param>
그리고 포스팅에 씌여져있는데로 톰캣에서 autoDeploy등 설정 하신 뒤에
직접 배포 된것을 수정해서 테스트해보셔야 합니다~
-