永发信息网

Spring定时任务为什么没有执行

答案:1  悬赏:0  手机版
解决时间 2021-04-15 13:24
Spring定时任务为什么没有执行
最佳答案
Spring定时任务的几种实现

博客分类:
spring框架
quartzspringspring-task定时任务注解
Spring定时任务的几种实现

近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将结合
spring框架来介绍。
一.分类

从实现的技术上来分类,目前主要有三种技术(或者说有三种产品):

Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少,这篇文章将不做详细介绍。
使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂,稍后会详细介绍。
Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多,稍后会介绍。
从作业类的继承方式来讲,可以分为两类:

作业类需要继承自特定的作业类基类,如Quartz中需要继承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要继承自java.util.TimerTask。
作业类即普通的java类,不需要继承自任何基类。
注:个人推荐使用第二种方式,因为这样所以的类都是普通类,不需要事先区别对待。

从任务调度的触发时机来分,这里主要是针对作业使用的触发器,主要有以下两种:

每隔指定时间则触发一次,在Quartz中对应的触发器为:org.springframework.scheduling.quartz.SimpleTriggerBean
每到指定时间则触发一次,在Quartz中对应的调度器为:org.springframework.scheduling.quartz.CronTriggerBean
注:并非每种任务都可以使用这两种触发器,如java.util.TimerTask任务就只能使用第一种。Quartz和spring task都可以支持这两种触发条件。

二.用法说明

详细介绍每种任务调度工具的使用方式,包括Quartz和spring task两种。
Quartz

第一种,作业类继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。

第一步:定义作业类

Java代码
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class Job1 extends QuartzJobBean {

private int timeout;
private static int i = 0;
//调度工厂实例化后,经过timeout时间开始执行调度
public void setTimeout(int timeout) {
this.timeout = timeout;
}


@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.println("定时任务执行中…");
}
}
第二步:spring配置文件中配置作业类JobDetailBean
Xml代码








说明:org.springframework.scheduling.quartz.JobDetailBean有两个属性,jobClass属性即我们在java代码中定义的任务类,jobDataAsMap属性即该任务类中需要注入的属性值。
第三步:配置作业调度的触发方式(触发器)
Quartz的作业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
配置方式如下:

Xml代码





第二种CronTriggerBean,支持到指定时间运行一次,如每天12:00运行一次等。
配置方式如下:
Xml代码





关于cronExpression表达式的语法参见附录。
第四步:配置调度工厂
Xml代码







说明:该参数指定的就是之前配置的触发器的名字。
第五步:启动你的应用即可,即将工程部署至tomcat或其他容器。

第二种,作业类不继承特定基类。

Spring能够支持这种方式,归功于两个类:
org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean
org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean
这两个类分别对应spring支持的两种实现任务调度的方式,即前文提到到java自带的timer task方式和Quartz方式。这里我只写MethodInvokingJobDetailFactoryBean的用法,使用该类的好处是,我们的任 务类不再需要继承自任何类,而是普通的pojo。
第一步:编写任务类
Java代码
public class Job2 {
public void doJob2() {
System.out.println("不继承QuartzJobBean方式-调度进行中...");
}
}
可以看出,这就是一个普通的类,并且有一个方法。
第二步:配置作业类
Xml代码
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">






说明:这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法。往下的步骤就与方法一相同了,为了完整,同样贴出。
第三步:配置作业调度的触发方式(触发器)
Quartz的作业触发器有两种,分别是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一种SimpleTriggerBean,只支持按照一定频度调用任务,如每隔30分钟运行一次。
配置方式如下:
Xml代码
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
梦幻将军令到期了,是不是就自动解除绑定了?
求:有那些三百左右的男士钱包~~
联想家悦D2041主机通电开不了机
这样的配置能玩梦幻诛仙吗
同发氧气厂我想知道这个在什么地方
DHC的免费试用版怎么申请?
琵琶行重点句子默写,琵琶行高考容易考的默写
以仁爱为主的歌曲
上大学的时候大家后悔做过或者没做些什么?
索爱w850i这机子好么?
请问利比亚本地手机卡(92号)接电脑gprs拨号
传世骨头饭在什么地方啊,我要过去处理事情
房地产售楼部开放各方恭贺条幅怎么写
南安是个好地方吗?
这个歌叫什么名字?高分
推荐资讯
一个手机号如何注册多过微信,或者不用手机号
易语言怎么使用取文本长?
下列哪一时期的社会状况与“天下为公,选贤任
有关《The importance of English》的英语作
爱但不能在一起的句子,有哪些关于克服困难的
关于雨天的诗句唯美,宫斗描写雨天的句子,要
下载了播放器为什么换不能看
天龙八部的非法问题…
pspnba2k10杂操作
韩国料理中的紫菜卷饭怎么做啊。。。。
可济药业在什么地方啊,我要过去处理事情
有没有免费的鬼故事
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?