定时任务在项目中很常用,本文主要根据博主自身使用定时的经验,分以下几个方面介绍定时任务。
1、Quartz定时任务概述和Spring配置Quartz定时任务
2、排程器工厂对定时任务进行增删修改
3、总结
Quartz定时任务概述:
Quartz是项目中常用的调度任务之一,是一个完全用java编写的开源作业调度框架,可以与J2EE和J2SE APP应用程序结合使用,也可以单独使用。 其主要组成部分是Job、Scheduler和CronExpression,但这里不介绍。 介绍Spring如何配置Quartz。
配置Quartz时,需要了解的是配置Quartz。 也就是说,配置作业、计划程序和CronExpression。 这三种配置完成后,将完成完整的计划任务,其配置如下:
配置完成后,添加运行任务的Java类。 每个Quartz Job都需要实现org.quartz.Job接口的具体类。 代码如下。
publicclasstestquartzjobextendsquartzjobbean {
@ overrideprotectedvoidexecuteinternal (jobexecutioncontextarg0) throwsJobExecutionException
//获取作业配置的接口
testserviceimpltestserviceimpl=(testserviceimpl ) arg0.getJobDetail ).getjobdatamap (.get (testserviceimpl ' ) ) ) //执行业务方法
quartzStart (;
}公共voidquartzstart ()//业务方法.
}
}
当然,Job不需要特意放置接口,而只需要使用Spring注入即可,但这里将介绍如何放置此接口。
到目前为止,您已经完成了一个简单的Quartz计划任务。 接下来,添加在项目中使用Quartz的情况。 cronExpression表达式是从数据库读取的。
当时,我解决这个问题的方法是继承org.spring framework.scheduling.quartz.crontriggerbean,设置cronExpression。 具体代码如下。
要更改Trigger的配置:
xx.InitCronTriggerFactoryBean代码:
publicclassinitcrontriggerfactorybeanextendscrontriggerfactorybeanimplementsserializable { privatestaticfinalllongserialversiong
@ resourceprivatesysparamservicesysparamservice; 隐私密钥; 公共语音设置(字符串密钥) )。
{this.key=key;
setcronexpression (getcronexpressionfromdb );
}隐私保护客户端xpressionfromdb (
{if(stringutils.isempty(key ) ) return '0 0/5 * * *?
SysParam sysParam=newSysParam (; try{
sys param=sysparamservice.getnamebykey (key;
} catch (执行e ) )
{
e .打印堆栈跟踪(;
(if ) sysparam!=空! string utils.isempty (sys param.getparam value () ) (returnsysParam.getParamValue ) ); return '0 0/5 * * *?' ;
}
}
其中,SysParamService是基于cronExpression表达式的接口,与key中的数据库查询相对应,除了Spring注入外,还可以使用set方法设置此接口:
这将sysParamService的set方法添加到xx.InitCronTriggerFactoryBean中。 这种情况下的xx.InitCronTriggerFactoryBean代码如下所示:
publicclassinitcrontriggerfactorybeanextendscrontriggerfactorybeanimplementsserializable { privatestaticfinalllongserialversiong
Impl sysParamService;privateString key;public voidsetKey(String key){this.key =key;
}public voidsetSysParamService(SysParamServiceImpl sysParamService)
{this.sysParamService =sysParamService;
setCronExpression(getCronExpressionFromDB());
}privateString getCronExpressionFromDB()
{if(StringUtils.isEmpty(key))return "0 0 0/1 * * ?";
SysParam sysParam= newSysParam();try{
sysParam=sysParamServiceImpl.getNameByKey(key);
}catch(Exception e)
{
e.printStackTrace();
}if(sysParam != null && !StringUtils.isEmpty(sysParam.getParamValue()))returnsysParam.getParamValue();return "0 0 0/1 * * ?";
}
}
Quartz定时任务到这里就差不多了,基本的配置和使用就是上面将的,想要深入了解Quartz可以在网上查找更多的资料,并在实践中使用。接下来将讲解在项目中使用的可以随时对定时任务进行增删改查操作的实例。
定时任务的增删改查,其实可以看做是对数据进行增删改查。不过,定时任务的增删改查是操作Job和Trigger,具体代码如下:
定时任务管理器代码:
public classQuartzManager {private static final Logger logger =LogPresident.getRootLogger();private static SchedulerFactory schedulerFactory = newStdSchedulerFactory();private static Map jobKeyMap = new HashMap();/*** 增加一个定时任务
*@authorzhiyuan.wu
* @date 2017年3月30日
*@paramjobName
*@paramtriggerName
*@paramcls
*@paramdate*/@SuppressWarnings({"rawtypes", "unchecked"})public static voidaddJob(String jobName, String triggerName, Class cls, Date date)
{try{
Scheduler scheduler=schedulerFactory.getScheduler();//job
JobDetail jobDetail =JobBuilder.newJob(cls).withIdentity(jobName, Scheduler.DEFAULT_GROUP).build();//触发器
SimpleTrigger trigger =(SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(triggerName, Scheduler.DEFAULT_GROUP).startAt(date).build();
scheduler.scheduleJob(jobDetail, trigger);//启动
scheduler.start();
jobKeyMap.put(jobDetail.getKey().getName(), jobDetail.getKey());
}catch(Exception e)
{
logger.error("--------添加定时任务出错:" +e.getMessage(), e);
}
}/*** 删除对应的定时任务
*@authorzhiyuan.wu
* @date 2017年3月29日
*@paramjobKey*/
public static voidremoveJob(JobKey jobKey)
{
Scheduler scheduler;try{
scheduler=schedulerFactory.getScheduler();
scheduler.deleteJob(jobKey);
jobKeyMap.remove(jobKey.getName());
}catch(SchedulerException e)
{
logger.error("--------删除定时任务出错:" +e.getMessage(), e);
}
}/*** 启动所有定时任务
*@authorzhiyuan.wu
* @date 2017年3月29日*/
public static voidstartJobs()
{try{
Scheduler sched=schedulerFactory.getScheduler();
sched.start();
}catch(Exception e)
{
logger.error("--------启动所有定时任务出错:" +e.getMessage(), e);
}
}/*** 停止所有定时任务
*@authorzhiyuan.wu
* @date 2017年3月29日*/
public static voidshutdownJobs()
{try{
Scheduler sched=schedulerFactory.getScheduler();if (!sched.isShutdown())
{
sched.shutdown();
}
}catch(Exception e)
{
logger.error("--------停止所有定时任务出错:" +e.getMessage(), e);
}
}/*** 修改定时任务
*@authorzhiyuan.wu
* @date 2017年3月29日
*@paramjobKey
*@paramjobName
*@paramtriggerName
*@paramcls
*@paramdate*/@SuppressWarnings("rawtypes")public static voidmodifyJobTime(JobKey jobKey, String jobName, String triggerName, Class cls, Date date)
{try{
removeJob(jobKey);
addJob(jobName, triggerName, cls, date);
}catch(Exception e)
{
logger.error("--------修改定时任务出错:" +e.getMessage(), e);
}
}/*** 打印当前定时任务的jobName
*@authorzhiyuan.wu
* @date 2017年3月29日
*@throwsSchedulerException*/
public static void printJobName() throwsSchedulerException
{for(String jobName : jobKeyMap.keySet())
{
logger.info("--------jobName:" +jobName);
}
}
}
Job代码:
public class TestJob implementsJob {private static final Logger logger =LogPresident.getRootLogger();public void execute(JobExecutionContext context) throwsJobExecutionException
{
JobKey jobKey=context.getJobDetail().getKey();
logger.info("--------定时任务开始执行:" +jobKey.getName());//业务方法...//移除定时任务
QuartzManager.removeJob(jobKey);
}
}
增加一个定时任务代码:
QuartzManager.addJob(JobName, TriggerName , TestJob.class, Date);
这样,在到达时间Date时,定时任务将会执行。不过这样增加的任务是保存在内存中,项目重启将会丢失定时任务,所以,最好增加一个类,在项目启动时将会扫描数据库,将未执行的定时任务重新加载到内存中去。
定时任务在项目中运用需要根据业务具体调整,但只要弄清楚定时任务的原理和实现,那么就可以在项目中灵活运它用来具体的业务,希望这篇文章可以让大家快速了解和运用定时任务,并运用到实践中。