zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    【转载】超级实用且不花哨的js代码大全 -----高级应用(一)
    【 Date 对象 参考手册】
    js随机数random()方法
    【转载】js数组的操作
    【转载】js数组和json的区别
    干货----004----MySQL忘记root密码怎么办?
    PHP框架——TP_0001----ThinkPHP常用配置
    干货----003----乱码解决方法
    Python之路【第二十六篇】:xml模块
    Python之路【番外篇1】:使用Python创建照片马赛克
  • 原文地址:https://www.cnblogs.com/beppezhang/p/6293471.html
Copyright © 2011-2022 走看看