nobodj
No SG 운동

나도 스프링 잡 스케쥴러 February 12, 2017





나도 스프링 잡 스케쥴러.

PL/SQL에서 처음 접한 스케쥴러가 스프링에도 있구만. 내가 삽질을 해서 그렇지, 정말 초간단하게 사용할 수 있었다. 내겐 xml 설정이 왜이러 어려운지. 한번 스케치를 다시 해볼 필요를 느낀다.

모든 페이지에서 접근하는 정보(하루에 한번만 갱신하면 되는 data를 페이지 접속시마다 db에 쿼리를 날리는 것은 비효율적이다. 물론 매페이지에 접근하는 메소드마다 이를 기술하는 것은 도저히 용납할 수 없는 귀찮음이다.

1. spring job scheduler 를 bean객체로 만들라

web.xml 에 기술한 DispacherServlet 클라스를 찾아서

conf/mvc/common-servlet.xml에 기술할 component-scan 체크(여기에 등록이 되야 bean으로 만들어 준다는 구만)

task관련은 다른 xml에 쓰기로 하자. task관련 클라스(?)를 import하면 따로 task태그를 기술할 필요가 없었다. 뭐지…

2. @Scheduled 어노테이션으로 실행할 메소드 만들기

@Service
public class KHScheduler {

@Resource(name = "com.kh.main.MainService")
private IMainService        mainService;

@PostConstruct
public void init() throws Exception{
getCurrBeginningInfo();
}

/** 
*  매일 새벽3시에 개강일 정보를 갱신하는 job 생성.
* 매니져 클라스에 데이터를 저장하고, view단에서 참조하게 한다.
* @throws Exception
 */
@Scheduled(cron="0 0 3 * * *")
public void getCurrBeginningInfo() throws Exception{
Map<String, Object>   model           = new HashMap<String, Object>();
List<Map<String, String>> currList      = null;

long time = System.currentTimeMillis(); 
SimpleDateFormat dayTime = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
String str = dayTime.format(new Date(time));
System.out.println(str);

long start = System.currentTimeMillis() ; 

/* 개강일(자바/보안) list */
currList = mainService.selectCurrBeginning();
KHCurrManager.getInstance().setCurrList(currList);

System.out.println(">>currList@KHScheduler = "+currList);

long end = System.currentTimeMillis(); 

System.out.println((end-start)/1000 +" 초 걸림");
}
}

3. Manager 클라스 singleton 객체로 만들기

매번 새로운 객체를 생성하지 않는 singleton객체를 만들어서 모든 세션에서 동일한 객체를 참조해서 data를 가져가기를 원한다.

  • 생성자에 db에 data를 가져오는 걸 기술해도 될 거 같은디.

4. 톰캣서버 실행시 한번, 그리고 스케쥴러에서 설정한 시간마다 실행되길 원한다.

1. @PostConstruct annotion 사용하기

@Component
public class Test { 
@PostConstruct
public void init(){
// 시스템 시작시 해야할 것
}
}

생성할 스프링의 Bean 안에 기술. 당연 이 Bean은 Compoent-scan이 되어야한다.

2. 물론 위에 자동으로 안하려면, @Component 어노테이션 뺀다. xml에 기술.

<bean class="패키지.Test"/>

3. @PostConstruct 어노테이션을 못쓸 환경이면

<bean class="패키지.Test" init-method="init"/>


Tags:
Categories Coding Digital Intox

Leave a Reply

Your email address will not be published. Required fields are marked *