Spring 정시 임무 실현 방법

26222 단어 자바

Spring 정시 임무 실현 방법  
태그: springquartztask
2017-03-11 02:02
190 명 읽 기
댓 글 (0)
수장 하 다
고발 하 다.
분류:
spring(3)
글 쓴 이
X
task
quartz
저작권 성명: 본 고 는 블 로 거들 이 창작 한 글 로 블 로 거들 의 허락 없 이 전재 할 수 없다.
디 렉 터 리 (?) [+]
  • Quartz
  • Spring-Task

  • 기술적 으로 정시 임 무 를 실현 하 는 흔 한 방법 은 세 가지 가 있다.
  • 자바 가 자체 적 으로 가지 고 있 는 자바 util. Timer 류
  • Quartz 스케줄 러 를 사용 하려 면 제3자 jar 지원
  • 이 필요 합 니 다.
  • Spring 3.0 이후 자체 적 으로 가지 고 있 는 task 타이머
  • 첫 번 째 방식 은 여기 서 설명 을 많이 하지 않 습 니 다. timer 류 의 기능 이 비교적 단일 하기 때문에 실제 프로젝트 에서 의 운용 도 비교적 적 습 니 다.
    Quartz
    Quartz 의 사용 방식 은 크게 세 가지 가 있 는데 이 세 가지 방식 은 여기 서 모두 spring 과 통합 되 기 때문에 applicationContext. xml 로 설정 합 니 다.
  • org. quartz. StatefulJob 또는 org. quartz. Job 인터페이스 실현
  • org. springframework. scheduling. quartz. QuartzJobBean 류 계승
  • 일반 클래스 + xml 프로필
  • 1. org. quartz. StatefulJob 또는 org. quartz. Job 인 터 페 이 스 를 실현 하려 면 먼저 applicationContext. xml 에서 정시 작업 tomcat 로 딩 초기 화 클래스 를 설정 하고 로 딩 할 때 init 방법 을 실행 합 니 다.
    
        <bean id="StarJob" class="com.lovo.task.server.impl.StarJob" init-method="init">bean>
  • 1
  • 2
  • 1
  • 2

  • 클래스 코드 초기 화
    package com.lovo.task.server.impl;
    
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.impl.StdSchedulerFactory;
    
    public class StarJob {
    
        public void init() throws SchedulerException{
            //TestImpl           
            TestImpl impl=new TestImpl();
            SchedulerFactory factory = new StdSchedulerFactory();  
            Scheduler scheduler = factory.getScheduler(); 
            try {
                //           
                impl.startJob(scheduler);
            } catch (Throwable e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            //      
            scheduler.start();
        }
    }
    

    작업 및 스케줄 링 실현 클래스
    package com.lovo.task.server.impl;
    
    import java.text.ParseException;
    
    import org.quartz.CronTrigger;
    import org.quartz.JobDetail;
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.quartz.Scheduler;
    import org.quartz.SchedulerException;
    import org.quartz.SchedulerFactory;
    import org.quartz.StatefulJob;
    import org.quartz.Trigger;
    import org.quartz.TriggerUtils;
    import org.quartz.impl.StdSchedulerFactory;
    
    import com.lovo.task.server.ITest;
    
    public class TestImpl implements StatefulJob,ITest {
    
    
    
        @Override
        public void execute(JobExecutionContext arg0) throws JobExecutionException {
            // TODO Auto-generated method stub
            test();
        }
    
        @Override
        public void startJob(Scheduler scheduler) throws Throwable {
            //     
            JobDetail JobDetail=new JobDetail("TestImpl",Scheduler.DEFAULT_GROUP, TestImpl.class);
            //       0  55  , 5     
            String rex="0/5 * * * * ?";
            //   ,      
            CronTrigger trigger=new CronTrigger("testTrigger","testGroup", rex);
            scheduler.scheduleJob(JobDetail, trigger);
    
            //   10     
    //      Trigger simplerTrigger = TriggerUtils.makeSecondlyTrigger(10);
    //      simplerTrigger.setName("SimpleTrigger");
    //      scheduler.scheduleJob(JobDetail, simplerTrigger);
    
        }
    
        public void test(){
            System.out.println("  ");
        }
    
    }
    

    2. org. springframework. scheduling. quartz. Quartz JobBean 류 를 계승 하여 먼저 xml 에서 설정 합 니 다.
        
        
        <bean id="TestTaskImpl" class="org.springframework.scheduling.quartz.JobDetailBean">
            
            <property name="jobClass" value="com.lovo.task.server.impl.TestTaskImpl">property>
            
            <property name="jobDataAsMap">
                <map>
                    <entry key="timeout" value="0">entry>
                map>
            property>
        bean>
    
        
        
        <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
            <property name="jobDetail" ref="TestTaskImpl">property>
            
            <property name="startDelay" value="0">property>
            
            <property name="repeatInterval" value="1000">property>
        bean>
        
    
    
        
        <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
            <property name="triggers">  
                <list>  
                    <ref bean="simpleTrigger" />  
                list>  
        property>  
        bean> 
     
      


    作业类代码

    package com.lovo.task.server.impl;
    
    import org.quartz.JobExecutionContext;
    import org.quartz.JobExecutionException;
    import org.springframework.scheduling.quartz.QuartzJobBean;
    
    import com.lovo.task.server.TestTask;
    
    public class TestTaskImpl extends QuartzJobBean implements TestTask{
    
        //time            
        private int timeout;
        public static int INDEX;
    
        public void setTime(int timeout) {
            this.timeout = timeout;
        }
    
    
        @Override
        protected void executeInternal(JobExecutionContext arg0)
                throws JobExecutionException {
            // TODO Auto-generated method stub
            testTask();
        }
    
        @Override
        public void testTask() {
            // TODO Auto-generated method stub
            INDEX++;
            System.out.println("       "+INDEX+" ");
    
        }
    
    }
    
     
      
    • 1


    3.普通类+xml配置文件
    首先定义个普通Java类

    package com.lovo.task.server;
    
    public class TestTask02 {
    
        public void Task(){
            System.out.println("         ");
        }
    
    }
    

    xml 에서 설정 하기
        
        
        <bean id="Task02" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            
            <property name="targetObject">
                <bean class="com.lovo.task.server.TestTask02">bean>
            property>
            
            <property name="targetMethod" value="Task">property>
            
            <property name="concurrent" value="false">property>
        bean>
    
        
            <bean id="simpleTrigger02" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
            <property name="jobDetail" ref="Task02">property>
            
            <property name="startDelay" value="0">property>
            
            <property name="repeatInterval" value="1000">property>
        bean>
        
    
        
        <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
            <property name="triggers">  
                <list>  
                    <ref bean="simpleTrigger02" />  
                list>  
        property>  
        bean> 
     
      
    • 1


    Spring-Task

    Spring自带的Task实现定时任务也有两种方式,一种是xml配置的方式,一种是使用注解@Scheduled,不管是那种方式,首先都需要在xml开头声明task

    
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:task="http://www.springframework.org/schema/task" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context-4.0.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                            http://www.springframework.org/schema/tx
                            http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                            http://www.springframework.org/schema/task
                            http://www.springframework.org/schema/task/spring-task-3.0.xsd">
     
      
    • 1

    配置定时器开关

    
            
        <task:scheduler id="Scheduler" pool-size="10"/> 
        <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>
     
      
    • 1

    基于注解的任务类

    package com.lovo.task.server;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Task03 {
    
        @Scheduled(cron="0/3 * * * * ?")
        public void test(){
            System.out.println("task    ");
        }
    
    }
    

    주석 에 익숙 하지 않 으 면 코드 의 간결 성 을 추구 하고 xml 에서 task 정시 작업 을 설정 할 수 있 습 니 다.
        
        <bean id="xmlTask" class="com.lovo.task.server.Task04">bean>
    
        
        <task:scheduled-tasks>
            <task:scheduled ref="xmlTask" method="test" cron="0/2 * * * * ?"/>
        task:scheduled-tasks>
    
        
        <task:scheduler id="Scheduler" pool-size="10"/> 
        <task:annotation-driven scheduler="Scheduler" proxy-target-class="true"/>
     
      
    • 1

    定时任务

    package com.lovo.task.server;
    
    public class Task04 {
    
        public void test(){
            System.out.println("xml   Task");
        }
    
    }
    
  • 1

  • 참조 원본:http://gong1208.iteye.com/blog/1773177 cronExpression 문법 필드 허용 값 이 허용 하 는 특수 문자 초 0 - 59, - * / 분 0 - 59, - * / 시간 0 - 23, - * / 날짜 1 - 31, - *? /L W C 월 1 - 12 또는 JAN - DEC, - * / 월요일 - 7 또는 SUN - SAT, - *? /L C \ # 년 (선택 가능) 비 워 두 기, 1970 - 2099, - * / - 구간 * 어댑터?너 는 그 필드 를 설정 하고 싶 지 않다. 아래 에 몇 가지 형식 만 예 를 들 면 된다.
    CRON 표현 식 의 미 는 '0 12 * *?' 매일 낮 12 시 에 '0 15 10? *' 을 촉발 합 니 다. 매일 아침 10: 15 에 '0 15 10 * *?' 를 촉발 합 니 다. 매일 아침 10: 15 에 '0 15 10 * *? *' 를 촉발 합 니 다. 매일 아침 10: 15 에 '0 15 10 * *? 2005 년 의 매일 아침 10: 15 에' 0 * 14 * '를 촉발 합 니까?매일 오후 2 시 부터 2 시 59 분 까지 매 분 마다 '0 / 5 14 * *?' 를 터치 합 니 다. 매일 오후 2 시 부터 2: 55 분 까지 5 분 마다 '0 / 5 14, 18 * *?' 를 터치 합 니 다. 매일 오후 2 시 부터 2: 55, 6 시 55 분 까지 두 시간 동안 5 분 마다 '0 - 5 14 *?' 를 터치 합 니 다. 매일 14: 00 부터 14: 05 분 마다 '0, 44 14, 3 WED' 를 터치 합 니 다.3 월 의 매주 수요일 14: 10 과 14: 44 는 '0, 15, 10? * MON - FRI' 를 촉발 합 니 다. 매주 월요일, 화요일, 수요일, 목요일, 금요일 의 10: 15 촉발 합 니 다.

    좋은 웹페이지 즐겨찾기