java的幾種定時任務


本篇博文主要是講述2.x 版本的quartz下的實現方案,1.x 版本的實現方式大致原理一致,但是具體的實現方式有些不一致,具體體現在獲取  scheduler 這個類的方式上有些不同,這里不作過多的描述;

1:java+Quartz實現定時任務:

首先:導入quartz相關的jar包,這里我用的是maven構建的項目,pom.xml文件導入如下:

<dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz</artifactId>
      <version>2.2.1</version>
  </dependency>
  <dependency>
      <groupId>org.quartz-scheduler</groupId>
      <artifactId>quartz-jobs</artifactId>
      <version>2.2.1</version>
  </dependency>  

定義要進行定時任務類(該類實現了Quartz 下的job類):

public class MyJob implements Job{

    @Override
    public void execute(JobExecutionContext arg0) throws JobExecutionException {
        // TODO Auto-generated method stub
        System.out.println("開啟了定時任務");
        
    }

}

接下來要做的就是按照定時任務的固定步驟來做即可:1:定義調度器並且開啟   2:定義任務器  3:定義觸發器   4 注冊 

具體代碼參考如下:

public class QuartzDemo {

    public void quartzTest() throws InterruptedException{
        try {
            //獲取調度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            scheduler.start();
            //創建任務器:定義任務細節
            JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
            ScheduleBuilder scheduleBuilder =SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();
            //定義觸發器
            Trigger trigger=TriggerBuilder.newTrigger().withIdentity("simpleTrigger", "simpleTriggerGroup")
            .withSchedule(scheduleBuilder).startNow().build();
            
            //將任務和觸發器注冊到調度器中
            scheduler.scheduleJob(jobDetail, trigger);
            Thread.sleep(1000*30);
//            scheduler.shutdown();
        } catch (SchedulerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

這里需要將線程睡眠30秒中才能看到定時的效果,不然會代碼立馬執行完畢,看不到效果;

 

2:spring + quartz 定義定時任務:

spring 管理quartz 有兩種方式:

1):自定義的任務類繼承特定的基類 QuartzJobBean 

2):自定義的任務類不繼承特定的基類  完全就是一個普通的pojo :這種方式的實現主要是spring下的類:org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

這里只講述第二種實現方式:

1:定義任務類:

public class QuartzJob {

    private void runJob(){
        System.out.println("開啟定時任務!!");
    }
}

2:通過spring配置的方式來定義以下幾個步驟:1:定義調度器並且開啟   2:定義任務器  3:定義觸發器   4 注冊 

spring-quartz.xml的配置如下所示:

<!--定義任務器-->
    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="quartzJob"/>
        <property name="targetMethod" value="runJob"/>
        <property name="concurrent" value="false"/>
    </bean>
    
    <bean id="quartzJob" class="bz.beppe.javase.QuartzJob"/>
    
    <!--定義觸發器-->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <!-- see the example of method invoking job above -->
        <property name="jobDetail" ref="jobDetail"/>
        <!-- 10 seconds -->
        <property name="startDelay" value="1000"/>
        <!-- repeat every 50 seconds -->
        <property name="repeatInterval" value="3000"/>
    </bean>
    <!--注冊任務器和觸發器到schedule中-->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- <ref bean="cronTrigger"/> -->
                <ref bean="simpleTrigger"/>
            </list>
        </property>
    </bean>

這里觸發器的定義有兩種方式:

1:SimpleTriggerBean:

2:CronTriggerBean:

用戶可以根據自身的需要來選擇相應的觸發器;

這里需要注意的是 org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean這個類是在spring-context-support這個包下的,需要引入這個

依賴;配置完了定時spring定時job后,需要注冊監聽器來監聽開啟spring-quartz.xml,我這里用的是在web.xml中配置監聽項目啟動后開啟spring-quartz.xml容器;

 

3:spring 自帶的定時任務:spring-task:

spring 自身的spring-task 不依賴任何的第三方框架,實現方式也很簡單:

這里需要做的就是在xml文件中的引入task命名空間,以便后續標簽中的使用:

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task 
 http://www.springframework.org/schema/task/spring-task-3.2.xsd

1:定義任務類:

public class TaskJob {

    public void springJob(){
        System.out.println("spring 自身的定時任務");
    }
}

2:在xml配置文件中配置定時job:

<!--配置任務類-->
    <bean id="beanA" class="bz.beppe.javase.TaskJob"></bean>  
    <!--定義觸發類和觸發方式-->
    <task:scheduled-tasks scheduler="myScheduler">
        <task:scheduled ref="beanA" method="springJob" fixed-rate="5000"/>
    </task:scheduled-tasks>

    <task:scheduler id="myScheduler" pool-size="10"/>
    

經過這樣的配置后在在開啟這個定時任務的spring容器后就會開始相應的定時job

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM