java定时任务以及Spring使用Quartz调度器执行定时任务

java下的java.util.Timer中类可以实现定时执行任务的执行:

如:让任务立即执行,每隔1s循环执行一次

    public class TimerClass {
    
        public static void main(String[] args) {
    
            Timer timer = new Timer();
    
            TimerTask task = new TimerTask() {
                int i = 0;
    
                @Override
                public void run() {
                    i += 1;
                    System.out.println("第" + i + "次执行");
                }
            };
            // 第二个参数,表示多长时间开始执行调度任务,
            // 第三个参数间隔多长时间执行
            timer.schedule(task, 0, 1000);
    
        }
    
    }
  • Timer缺陷:
    • Timer对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。
    • Timer线程是不会捕获异常的,如果TimerTask抛出的了未检查异常则会导致Timer线程终止,同时Timer也不会重新恢复线程的执行,他会错误的认为整个Timer线程都会取消。

缺陷:http://blog.csdn.net/chenssy/article/details/32703499

使用Executors管理线程,调用newScheduledThreadPool()方法来执行重复任务

http://www.jianshu.com/p/a898655b787a

定时任务在Spring中的应用

一、Spring3.0以后提供了基于Spring的轻量级时间调度框架,可定时执行一些任务

二、Spring中使用Quartz框架来做调度任务:主要讲述Quartz在Spring中的用法。

  • 从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:
    • 每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
    • 每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
  • 从作业类的继承方式来讲,可以分为两类:
    • 作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
    • 作业类即普通的java类,不需要继承自任何基类。
主要说明作业类不继承特定基类的方式。

Spring能够支持这种方式,归功于两个类:
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任务类不再需要继承自任何类,而是普通的pojo。

  • maven依赖

      <dependency>
          <groupId>org.quartz-scheduler</groupId>
          <artifactId>quartz</artifactId>
          <version>2.2.2</version>
      </dependency>
  • 创建Job类

      public class ShowTimeJob {
    
          private void showTime() {
    
              System.out.println("每秒执行:" + new Date());
    
          }
    
      }
  • 在ApplicationContext.xml中配置作业类

      <!-- 配置作业类 -->
      <bean id="job1"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
          <property name="targetObject">
              <bean class="com.yl.page.job.ShowTimeJob" />
          </property>
          <property name="targetMethod" value="showTime" />
          <property name="concurrent" value="true" /><!-- 作业并发调度 -->
      </bean>
  • 配置触发器:Quartz提供两种触发器形式,cron和simple两种。

      <!-- 配置触发器两种配置一种即可,配置两种不行 -->
      <!-- CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。 -->
      <bean id="cronTrigger"
          class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
          <property name="jobDetail" ref="job1" />
          <!-- 0 36 20 * * ? -->
          <!-- Cron生成器网址:http://cron.qqe2.com/ -->
          <property name="cronExpression" value="10/5 * * * * ?" />
      </bean>
    
    
      <!-- SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。 -->
      <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
          <property name="jobDetail" ref="job1" />
          <property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过0秒开始执行调度 -->
          <property name="repeatInterval" value="2000" /><!-- 每2秒调度一次 -->
      </bean>
  • 配置工厂类,管理

      <!-- 配置工厂类 -->
      <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
          <property name="triggers">
              <list>
                  <ref bean="cronTrigger" />
                  <ref bean="simpleTrigger" />
              </list>
          </property>
      </bean>
使用cron的时候,可以使用cron表达式来对配置执行的时间,次数等,cron表达式生成器网址:http://cron.qqe2.com

其他更多可以参考:http://gong1208.iteye.com/blog/1773177

Demo:https://github.com/esileme/MybatisPager.git

转载于:https://www.cnblogs.com/esileme/p/7577529.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值