在spring boot中使用quartz时,在job中一般需要引用spring管理的bean,通过定义job factory实现自动注入。
spring有自己的schedule定时任务,在spring boot中使用的时候,不能动态管理job,于是就使用quartz来实现。
在spring boot中配置quartz:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
import java.io.ioexception;
import java.util.properties;
import org.springframework.beans.factory.annotation.autowired;
import org.springframework.beans.factory.config.propertiesfactorybean;
import org.springframework.context.annotation.bean;
import org.springframework.context.annotation.configuration;
import org.springframework.core.io.classpathresource;
import org.springframework.scheduling.annotation.enablescheduling;
import org.springframework.scheduling.quartz.schedulerfactorybean;
@configuration
@enablescheduling
public class quartzschedule {
@autowired
private myjobfactory myjobfactory;
@bean
public schedulerfactorybean schedulerfactorybean() throws ioexception {
schedulerfactorybean factory = new schedulerfactorybean();
factory.setoverwriteexistingjobs( true );
// 延时启动
factory.setstartupdelay( 20 );
// 加载quartz数据源配置
factory.setquartzproperties(quartzproperties());
// 自定义job factory,用于spring注入
factory.setjobfactory(myjobfactory);
return factory;
}
/**
* 加载quartz数据源配置
*
* @return
* @throws ioexception
*/
@bean
public properties quartzproperties() throws ioexception {
propertiesfactorybean propertiesfactorybean = new propertiesfactorybean();
propertiesfactorybean.setlocation( new classpathresource( "/quartz.properties" ));
propertiesfactorybean.afterpropertiesset();
return propertiesfactorybean.getobject();
}
}
|
为了在job中使用spring管理的bean,需要重新定义一个job factory:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
@component
public class myjobfactory extends adaptablejobfactory {
@autowired
private autowirecapablebeanfactory capablebeanfactory;
@override
protected object createjobinstance(triggerfiredbundle bundle) throws exception {
// 调用父类的方法
object jobinstance = super .createjobinstance(bundle);
// 进行注入
capablebeanfactory.autowirebean(jobinstance);
return jobinstance;
}
}
|
然后在job中就可以使用spring管理的bean了
1
2
3
4
5
6
7
8
9
10
11
12
|
public class myjob implements job, serializable {
private static final long serialversionuid = 1l;
private logger logger = loggerfactory.getlogger( this .getclass());
@autowired
private someservice someservice;
@override
public void execute(jobexecutioncontext context) throws jobexecutionexception {
someservice.dosomething();
}
}
|
下面代码是创建job:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
jobdetail jobdetail = jobbuilder.newjob(((job) class .forname(job.getclazz()).newinstance()).getclass())
.withidentity(job.getjobname(), job.getjobgroup()).build();
jobdetail.getjobdatamap().put( "extdata" , job.getextdata());
// 表达式调度构建器
cronschedulebuilder schedulebuilder = cronschedulebuilder.cronschedule(job.getcronexpression())
.withmisfirehandlinginstructiondonothing();
// 构建一个trigger
triggerbuilder<crontrigger> triggerbuilder = triggerbuilder.newtrigger().withidentity(triggerkey)
.withschedule(schedulebuilder);
if (job.getstarttime() != null ) {
triggerbuilder.startat(job.getstarttime());
}
if (job.getendtime() != null ) {
triggerbuilder.endat(job.getendtime());
}
crontrigger trigger = triggerbuilder.build();
scheduler.schedulejob(jobdetail, trigger); // 注入到管理类
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/softidea/p/6073495.html