티스토리 툴바


Diary/Today2011/06/24 06:20
Tistory 에서 @tistory.com 으로 메일주소를 변경하면 !!!

Daum Cloud 용량을 100GB 로 업그레이드 해주네요!! 

hanmail.net 을 쭉썼는데.. 클라우드때문에 주소 옴깁니다.

내친김에 클라우드 도 한번 써봐서 편의성을 체험해봐야겠네요 
저작자 표시
Posted by 아치즈

댓글을 달아 주세요

Dev/Spring2011/06/18 05:22
http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/    

위의 SpringSource 포럼에 올라온 아티클 내용인 즉슨

Spring 에서 동적으로 Database source 를 변경하여 Container 가 작동중일때 자유자재로

DB Source를 변경하여 각기 제어할 수 있다.

위에서 사용한 방식은 여러개의 Datasource 정보를 정의 한  후 사용할 Datasource 정보를 Threadlocal 변수에 저장하고

AbstractRoutingDataSource의 Lookup 으로 ThreadLocal 변수에 있는 DB 정보를 사용하는 방식이다.

우선 여러개의 Datasource 를 정의한다.

servlet.xml

        <bean id="dataSource_APPLE" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

               <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

               <property name="url" value="jdbc:sqlserver://databaseAddress;DatabaseName=APPLE" /> 

               <property name="username" value="APPLE" />

               <property name="password" value="APPLEPASS" />

        </bean>

       

 

        <bean id="dataSource_GRAPE" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

               <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />

               <property name="url" value="jdbc:sqlserver://databaseAddress;DatabaseName=GRAPE" /> 

               <property name="username" value="GRAPE" />

               <property name="password" value="GRAPEPASS" />

        </bean>


 

APPLE 과 GRAPE DB 를 Threadlocal 변수에 저장하고 Lookup 하여 사용하기위에 Entry Key 를 정의한다.


DynamicDSType.java

public enum DynamicDSType {       

        APPLE,

        GRAPE

}



이제 위의 Key 를가지고 ThreadLocal 변수에 datasource 를 대입하는 contextholder 를 만든다.

public class DynamicDSContextHolder {

 

       private static final ThreadLocal<DynamicDSType> contextHolder = new ThreadLocal<DynamicDSType>();

       

        public static void setDynamicDSType(DynamicDSType dynamicDSType){

              

               Assert.notNull(dynamicDSType,"DynamicType cannot be null");

               contextHolder.set(dynamicDSType);

        }

       

        public static DynamicDSType getDynamicDSType(){

              

               if (contextHolder.get() == null) {

                       return DynamicDSType.APPLE;

               }

               return (DynamicDSType) contextHolder.get();

        }

       

        public static void clearDynamicDSType(){

               contextHolder.remove();

        }

}


여기까지는 datasource 들의 key 를 정의 하고 ThreadLocal 변수에 대입까지 하는 Class 를 만들었다.

이제부터 유심히 봐야 하는 부분인데. 각 entry key 에 datasource 정보를 정의하고 AbstractRoutingDataSource Class 를 이용하여

lookup method 를 구현한다.


일단 entry key 에 datasource 정보를 참조하도록 정의한다.
servlet.xml

        <bean id="dataSource" class="com.common.module.DynamicRoutingDataSource">

               <property name="targetDataSources">                                                    

                       <map key-type="com.common.module.DynamicDSType">

                              <entry key="APPLE" value-ref="dataSource_APPLE"></entry>

                              <entry key="GRAPE" value-ref="dataSource_GRAPE"></entry>

                       </map>

               </property>

               <property name="defaultTargetDataSource" ref="dataSource_APPLE"/>             

        </bean>

 

Lookup Method 구현
DynamicRoutingDataSource.java

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
 

public
class DynamicRoutingDataSource extends AbstractRoutingDataSource{

        @Override

        protected Object determineCurrentLookupKey() {

               return DynamicDSContextHolder.getDynamicDSType();

        }

}

 
DynamicDSContextHolder.getDynamicDSType()  메서드를 Lookup 한다.

그것은 ThreadLocal 변수에서 dataSource 정보 가져와 Container 에서 사용하겠다고 정의하는 부분이다.


아래처럼 DB Connection 전에 Datasource 정보를 ContextHolder를이용하여 변경할 수 있다.

DynamicDSContextHolder.setDynamicDSType(DynamicDSType.APPLE);

List<Item> appleItems = catalog.getItems();

  


 
저작자 표시
Posted by 아치즈

댓글을 달아 주세요

Dev/Quartz2011/06/17 04:33
현재까진 Quartz 2.0 이 나왔으나 

관련 포럼에서는 Quartz 2.0 이 Spring 3.0 에 문제를 발생시킨다 한다.

Quartz 1.8 은 문제없이 잘 돌아간다.



간단히 Quartz 는 Java Job Scheduler 라고 보면된다. 

Quartz 1.8.5 :  http://www.quartz-scheduler.org/download/download-catalog.html


다운받은 Quartz 를 압축해제후 Quartz-1.8.5.jar 파일을 해당 WAS Library 에 Import 한다


두가지 요소의 Class 를 생성할것이다.

첫번째론 작업이 실행될 Class(JobTask)
두번째는 위의 Class 를 스케쥴러를 통해 실행하게 끔 해주는 JobBean 을 만들 것이다. (JobScheduler)

우선 심플하게 JobTask Class 를 보면

 /**  JobTask.java**/

public class JobTask { public void test(){ System.out.println("Task 실행!"); } } 


그 다음 위의 클래스를 스케쥴러에 의해 실행되게 해주는 Class 를 만든다.



 /**  JobScheduler.java**/

import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class JobScheduler extends QuartzJobBean{ private JobTask jobTask; public void setJobTask(JobTask jobTask) { this.jobTask = jobTask; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { jobTask.test(); } }


이제 기본 Class 는 다만들었고 Container 에서 인식할 수있게 Servlet 에서 Bean 정의를 해준다.

 1. 위의 Class 들의 Bean 정의
 2. JobDetailBean 
 3. Quartz Trigger 정의
 4. SchedulerFactoryBean 에 설정한 Bean 주입

 
 
 우선 JobTask Bean을 정의한다.


<
bean id="JobTask" class="com.apro.service.JobTask"/>
 
  


다음은 Spring에서 Quartz 연동을 제공하는 JobDetailBean 을 정의한다.
기본 Property 는  위에서만든 JobTask 정보 와스케쥴러를 통해서 실행되게 할 JobScheduler 이다.


<bean name="JobProcess" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.apro.service.JobScheduler"/> <property name="jobDataAsMap"> <map> <entry key="JobTask" value-ref="JobTask"></entry> </map> </property> </bean>
 



다음은 Trigger
Quartz 에서 제공하는 Trigger 는 2가지이다

1. SimpleTrigger :  Job 시작시간, 종료시간, 실행간격 등 간단한 설정으로 정의
2. CronTrigger    : Unix Cron Expression 을 이용하여 SimpleTrigger 보다 더 정교하게 Job 시간을 정의 할 수있다.

CronTrigger 를 이용하여 매일 5초마다 JobTask 가 실행되게 Trigger 를 정의하면 아래와 같다.


<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="JobProcess"/> <property name="cronExpression" value="0/5 * * * * ?"/> </bean>
 

 

마지막으로 위의 JobDetailBean 과 TriggerBean 을 Spring 에서 제공하는 SchedulerFactoryBean 에 Injection 시킨다.
 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="JobProcess"/> </list> </property> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
 



이제 Spring container 를 가동시켜보면.

아래와 같이 5초마다 JobTask 가 실행되는걸 확인 할 수 있다.





저작자 표시
Posted by 아치즈

댓글을 달아 주세요