728x90
반응형

Spring scheduler 사용
 출처 : http://openframework.or.kr/framework_reference/spring/ver1.2.2/html/scheduling.html
 출처 : http://www.zilverline.org/zilverlineweb/space/scheduling
 
 <bean id="methodInvokingJobDetail"
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      <property name="targetObject"><ref bean="exampleBusinessObject"/></property>
      <property name="targetMethod"><value>doIt</value></property>
      <property name="concurrent"><value>false</value></property>
 </bean>

  위의 예는 (아래에 있는) exampleBusinessObject의 doIt을 호출하는 것을 의미한다.

  public class BusinessObject {
 
     // properties and collaborators
 
     public void doIt() {
       // do the actual work
     }
  }
 
 default로는 Quartz Jobs는 비상태이며, 상호 작용하는 jobs의 가능성을 가진다.
 만약 당신이 동일한 JobDetail에 대해 두 개의 triggers를 명시한다면,
 첫번째 job이 끝나기 이전에 두번째가 시작할지도 모른다. 만약 JobDetail 객체가 상태 인터페이스를 구현한다면,
 이런 일은 발생하지 않을 것이다. 두번째 job은 첫번째가 끝나기 전에는 시작하지 않을 것이다.
 MethodInvokingJobDetailFactoryBean를 사용한 jobs가 동시작용하지 않도록 만들기 위해서는,
 concurrent 플래그를 false로 세팅해주어야 한다.
 
 <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail">
      // see the example of method invoking job above
      <ref bean="methodInvokingJobDetail"/>
    </property>
    <property name="startDelay">
      // 10 seconds
      <value>10000</value>
    </property>
    <property name="repeatInterval">
      // repeat every 50 seconds
      <value>50000</value>
    </property>
 </bean>

 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="exampleJob"/>
    </property>
    <property name="cronExpression">
     //시간에 대한 정의는 http://quartz.sourceforge.net/javadoc/org/quartz/CronTrigger.html 가면 더 자세히 볼수있음.
      방법 1// run every morning at 6 AM
      <value>0 0 6 * * ?</value>
      방법 2// run every night at 03:14
      <value>0 14 03 * * ?</value>
      방법 3// run every saturday at 03:15
      <value>0 15 03 * * SAT</value>
    </property>
 </bean>
 
 두 개의 triggers를 세팅. 하나는 10초 늦게 실행해서 매 50초마다 실행될 것이고,
 다른 하나는 매일 아침 6시에 실행될 것이다. 모든 것을 완료하기 위해서, SchedulerFactoryBean을 세팅해야 한다.

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

 

 

이슈티엘의 실제 사용예

테스트 사용 환경

tomcat 5.0 

java 1.4.08

Spring 1.2.7

quartz 1.5.1

 

###주의###

quartz.jar 는 %catalina_home%/common/lib/ 하위에 가져다 놓아야 한다.

 

이슈티엘의 bean.xml

 

<!--mail send by Scheduler-->
 <bean id="mailSendingJobDetail"
    class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
     <property name="targetObject">
      <ref bean="mailingSendByScheduler"/>
     </property>
     <property name="targetMethod">
      <value>doMailSending</value>
     </property>
     <property name="concurrent">
      <value>false</value>
     </property>
 </bean>
 
 <bean id="mailSendingCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="mailSendingJobDetail"/>
    </property>
    <property name="cronExpression">
     <!--매일 am 00:00-->
      <value>00 00 00 * * ?</value>
    </property>
 </bean>
 <!--mail send by Scheduler-->
 
 <!--크론추가는 list 에 해당 beanId 를 추가해주면 된다.-->
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
         <ref local="mailSendingCronTrigger"/>
      </list>
    </property>
 </bean>

 

여기까지만 해주면 해당 시간이 되면 tomcat 가 자동으로  해당 메소드를 실행해준다~!!

 

해당메소드가 포함된 이슈티엘의 메일보내기 CLASS

 

package com.koenet.tomato.framework.bean.admin.mailing.sendInfo;

import java.util.List;

import com.koenet.tomato.framework.bean.admin.mailing.manager.MailingMngDataDefinition;
import com.koenet.tomato.framework.dao.admin.mailing.manager.MailingMngDAO;
import com.koenet.tomato.framework.dao.admin.mailing.manager.TomatoMailingMng;
import com.koenet.tomato.framework.dao.admin.mailing.sendInfo.MailingSendInfoDAO;
import com.koenet.tomato.framework.dao.admin.mailing.sendInfo.TomatoMailingSendInfo;
import com.koenet.tomato.framework.mail.MailSenderManager;
import com.koenet.tomato.framework.util.string.StringUtil;
import com.koenet.tomato.framework.util.text.DateFormatUtil;

/**
 * @author saver
 * 스케줄링에 의한 메일 발송
 */
public class MailingSendByScheduler {
 
 private MailingMngDAO mailingMngDAO = null;
 private MailingSendInfoDAO mailingSendInfoDAO = null;
 private MailingMngDataDefinition mailingMngDataDefinition = null;
 private MailSenderManager mailSenderManager = null;
 private String mailViewCheckUrl = null;
 
 /**
  * @param dao
  */
 public void setMailingMngDAO(MailingMngDAO dao){
  mailingMngDAO = dao;
 }
 
 /**
  * @param dao
  */
 public void setMailingSendInfoDAO(MailingSendInfoDAO dao){
  mailingSendInfoDAO = dao;
 }
 
 /**
  * @param dataDefinition
  */
 public void setMailingMngDataDefinition(MailingMngDataDefinition dataDefinition){
  mailingMngDataDefinition = dataDefinition;
 }
 
 /**
  * @param manager
  */
 public void setMailSenderManager(MailSenderManager manager){
  mailSenderManager = manager;
 }
 
 /**
  * @param url
  */
 public void setMailViewCheckUrl(String url){
  mailViewCheckUrl = url;
 }
 
 /**
  * 메일 보내기 첫 호출 메소드.
  */
 public void doMailSending() {
  
  String today = DateFormatUtil.getToday("yyyyMMdd");
  
  List list = mailingMngDAO.getMailingSendInfos(today);
  setTemplateHtmlAndMailingSend(list);
 }
 
 private void setTemplateHtmlAndMailingSend(List list){
  
  for( int i=0 ; i<list.size() ; i++ ){
   Object obj = list.get(i);
   if (obj instanceof TomatoMailingMng) {
    TomatoMailingMng mailingMng = (TomatoMailingMng) obj;
    
    /**
     * 메일링 상태를 변경(상태 : 발송 중)
     **/
    mailingMngDAO.updateState(mailingMng);
    
    mailingMng.setContentL( mailingMngDataDefinition.getMailingTemplateHtml(mailingMng) );
    getMailingSendInfos(mailingMng);
   }
  }
 }
 
 private void getMailingSendInfos(TomatoMailingMng mailingMng){
  
  int countSuccess = 0;
  int countFail = 0;
  
  List list = mailingSendInfoDAO.getMailingSendInfos( mailingMng.getMailingIdC() );
  for( int i=0 ; i<list.size() ; i++ ){
   Object obj = list.get(i);
   if (obj instanceof TomatoMailingSendInfo) {
    TomatoMailingSendInfo sendInfo = (TomatoMailingSendInfo) obj;
    
    /**
     * 메일을 보낸 후 성공여부를 체크하여 성공여부에 따른 전체 카운트 수를 구한다.
     **/
    if( mailingSend(sendInfo, mailingMng) )  countSuccess++;
    else          countFail++;
   }
  }
  /**
   * 성공여부에 따른 전체 카운트 수와 메일 발송 상태 변경(상태 : 완료)
   **/
  mailingMng.setSendSuccessN(countSuccess);
  mailingMng.setSendFailN(countFail);
  mailingMngDAO.updateMailingMngOfMailSend(mailingMng);
 }
 
 
 private boolean mailingSend(TomatoMailingSendInfo sendInfo, TomatoMailingMng mailingMng){
  /**
   * 수신여부 확인 URL 로 치환해준다.
   **/
  String url = mailViewCheckUrl;
  url += "?mailingIdC="+sendInfo.getMailingIdC();
  url += "&mailingSeqN="+sendInfo.getMailingSeqN();
  String content = StringUtil.replace("<!--__VIEW__CHECK__URL__-->", url, mailingMng.getContentL());
  
  boolean sendSuccess = mailSenderManager.mailSender(
    sendInfo.getUserNameV(), sendInfo.getUserEmailV(), mailingMng.getSubjectV(), content );
  
  /**
   * 메일을 보낸 후 성공여부를 체크
   **/
  if(sendSuccess) sendInfo.setIsSuccessC("Y");
  else   sendInfo.setIsSuccessC("N");
  
  /**
   * 메일링 발송정보 테이블 업데이트
   **/
  updateMailingSendInfo(sendInfo);
  
  return sendSuccess;
 }
 
 private void updateMailingSendInfo(TomatoMailingSendInfo sendInfo){
  mailingSendInfoDAO.updateMailingSendInfo(sendInfo);
 }

}

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,