2014/10/27

[Spring] Spring mvc에서 Quartz 적용하기

 
1. 샘플 프로젝트 생성
STS 에서 [File] - [New] - [Spring Template Project] 메뉴를 클릭한 후 Spring MVC Project를 이용해 샘플 프로젝트를 생성한다.
 
2. pom.xml 파일 수정
quartz 관련 모듈을 이용하기 위해서 pom.xml 파일에 관련 라이브러리들 넣는다.
spring-tx, quartz, commons-collections, javax.transaction 4개 넣어줘야한다.

?
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${org.springframework-version}</version>
</dependency>
<!-- Quartz framework and dependencies -->
<dependency>
    <groupId>opensymphony</groupId>
    <artifactId>quartz</artifactId>
    <version>1.6.3</version>
    <scope>compile</scope>
</dependency>
<!-- Quartz 1.6.0 depends on commons collections -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.1</version>
    <scope>runtime</scope>
</dependency>
<!-- Quartz 1.6.0 requires JTA in non J2EE environments -->
<dependency>
    <groupId>javax.transaction</groupId>
    <artifactId>jta</artifactId>
    <version>1.1</version>
    <scope>runtime</scope>
</dependency>

 
3. 주기적으로 실행 될 Bean 생성
2개의 Bean을 만든다.
CronQuartz1.java

?
package com.mungchung.sample;
 
import java.text.SimpleDateFormat;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
 
public class CronQuartz1 extends QuartzJobBean{
    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        long time = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        System.out.println("Cron trigger 1 (5 second): current time = " + sdf.format(time));
    }
 
}

CronQuartz2.java

?
package com.mungchung.sample;
 
import java.text.SimpleDateFormat;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
 
public class CronQuartz2 extends QuartzJobBean{
    @Override
    protected void executeInternal(JobExecutionContext arg0)
            throws JobExecutionException {
        long time = System.currentTimeMillis();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");
        System.out.println("Cron trigger 2 (1 minute): current time = " + sdf.format(time));
    }
}

 
4. quartz Bean과 위에서 생성한 Bean 연동
2개의 Bean이 각각 다른 시간차이로 실행되도록 설정해줄것이다.
CronQuartz1.java - 5초마다 실행
CronQuartz2.java - 1분마다 실행
 
/src/main/webapp/WEB-INF/spring/root-context.xml

?
<!-- 1. Cron 대상이 되는 클래스 정의 -->
<bean id="cronQuartz1" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.mungchung.sample.CronQuartz1"/>
</bean>
<bean id="cronQuartz2" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.mungchung.sample.CronQuartz2"/>
</bean>
 
<!-- 2. Cron 시간 설정 -->
<bean id="cronTrigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="cronQuartz1"/>
    <property name="cronExpression" value="0/5 * * * * ?"/>
</bean>
<bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="cronQuartz2"/>
    <property name="cronExpression" value="0 0/1 * * * ?"/>
</bean>
 
<!-- 3. Cron 실행 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger1"/>
            <ref bean="cronTrigger2"/>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">3</prop>
            <prop key="org.quartz.threadPool.threadPriority">4</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
            <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
        </props>
    </property>
</bean>

 
 
Cron Expression
총 7개의 필드 있고 마지막 필드(년도)는 생략 가능하다

 필드이름허용 값 
초(Seconds)0 ~ 59 
분(Minutes)0 ~ 59 
시간(Hours)0 ~ 23
달의 날짜(Day-of-month)1 ~ 31
달(Month) 1 ~ 12 or JAN ~ DEC
주의 날짜(Day-of-week)1 ~ 7 or SUN-SAT
년도(Year) (선택가능) 빈값, 1970 ~ 2099

Cron Expression의 특수문자
Expression설명 예시 
    * 모든 수를 나타냄  
     -값의 사이를 의미* 10-13 * * * *     10,11,12,13분에 동작함 
     ,특정값 지칭* 10,11,13 * * * *      10,11,13분에 동작함
     /값의 증가를 표현* 0/5 * * * *       0분부터 시작해서 5분마다 동작 
     ?특별한 값이 없음을 나타냄(day-of-month, day-of-week 필드만 사용) 
     L마지막 날을 나타냄(day-of-month, day-of-week 필드만 사용) 



6. 실행결과
실행결과를 보면 하나는 5초마다, 다른 하나는 1분마다 Bean이 실행되고 있음을 알수 있다.
 
 
 
출처 :

[Toad] Table Space 및 사용자 계정 만들기

사용자 계정 및 테이블 스페이스 만들기
1. 테이블 스페이스 만들기

1) SYSTEM USER 로 로그인
사용자 계정과 테이블을 만들 수 있는 공간으로서 테이블 스페이스를 만들기 위해서 SYSTEM 계정으로 접속합니다.


Tip >> 2. 기존에 가동 중인 서버에 추가로 데이터를 기동 하기 위해서는 

setenv ORACLE_SID ora_sid 로 해 주신 다음에 기존 가동 데이터를 작성 하시던 방법 그대로 하심 됩니다.
물론 init.ora 파일 데이터 파일등등 모두 새로 다 만들어 주셔야 합니다.
새로 다시 하나 만든다고 보시면 될거 같습니다.
물론 오라클 SID명은 달리 하셔야 되구요.
가동중의 데이터를 기동 하게 되면 오라클 에러가 납니다.
즉 두개의 데이터 베이스가 가동 하게 되는 것입니다만...
무슨 이유에서 그렇게 하시는지는 모르겠지만...
한 서버에 한개의 데이터베이스가 이상적입니다.

==> 한 서버에 사용자를 바꾸면서 몇개의 데이트 베이스를 구축하는 방법이 유용할 듯 하군요.
더 이상 고민할것 없이 바로 Tablespace 를 추가합시다. 


2) Schema Browser를 통해서 Tablespace 생성

Toad의 Schema Browser 에서 Tablespace Tab 선택

다음의 내용들을 추가합니다.

. Tablespace 이름 지정
. Block Size 지정 (Default : 8 kb)
. Datafile Name 지정 : /usr/local/oracle/u01/app/oracle/oradata/ORADEV/...
. Database Size 지정
. AutoExtend 여부 지정
. Contents : Permanent
. Logging, Online Option 체크


2. 사용자 만들기

Toad의 Schema Browser 에서 User Tab 선택

새로운 사용자 추가

> UserInfo Tab
. User Name 과 Password 입력
. Authentication 은 "Use Database Authentication" 을 사용합시다.

> Tablespace Tab
. Default Tablespace Name 을 지정
. Temporary tablespace 를 지정

> Role Tab
사용자 롤을 지정합니다.
일반적으로 CONNECT 와 RESOURCE 권한을 지정하고
EXP_FULL_DATABASE
IMP_FULL_DATABASE 권한도 같이 주자.

admin option 을 추가하면 자기가 받은 권한을 다른 user에게도 줄수 있다.(필요 없다)
default option 을 추가한다. default option 을 주면 로그인시 자동으로 부여받은 권한이 Enable 된다.

오라클에 기본적으로 미리 생성된 roles 
CONNECT
RESOURCE
DBA : WITH ADMIN OPTION을 포함한 모든 system 권한을 주낟.
EXP_FULL_DATABASE : DB export 권한을 준다.
IMP_FULL_DATABASE : DB import 권한을 준다.
DELETE_CATALOG_ROLE : data dictionary table의 delete 권한을 준다.
EXECUTE_CATALOG_ROLE : data dictionary package의 execute 권한을 준다.
SELECT_CATALOG_ROLE : data dictionary table의 select 권한을 준다.


> System Privileges Tab



출처 :
http://sjunious.egloos.com/viewer/824415