spring boot quartz动态定时任务,quartz框架和spring定时任务
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
这篇文章给大家介绍跳趾石英以持久化的方式实现定时任务,详情如下所示:
篇幅较长,耐心的人总能得到最后的答案小生第一次用石英做定时任务,不足之处多多谅解。
首先
在跳羚项目里做定时任务是比较简单的,最简单的实现方式是使用* * @已安排注解,然后在应用启动类上使用@EnableScheduling**开启定时任务。
示例
@SpringBootApplication
@启用调度
公共类应用程序{
公共静态void main(String[] args) {
春季申请。运行(应用程序。class,args);
}
//cron为每秒执行一次
@Scheduled(cron=* * * * * .)
公共作废打印(){
System.out.println(执行定时任务);
}
}######结果
简单的定时任务就可以用这种方式来做,cron表达式的结果为任务执行的间隔时间。
然而
实际开发中,我们的任务可能有很多,且需要手动操作单个/全部的任务,比如添加、开启、停止、继续等等操作。那么伴随着(千牛B类。)的背景音乐有请石英登场。
quartz
整合
属国
groupIdorg.springframework.boot/groupId
artifactId弹簧-靴子-启动器-石英/artifactId
/依赖关系quartz的三要素
调度器调度程序启动触发器去执行任务触发器引发用来定义作业(任务)触发条件、触发时间,触发间隔,终止时间等
任务job
具体要执行的任务内容
使用
使用石英是需要配置文件的,石英。属性在石英的冲突包的org。石英包下可以找到默认的配置文件石英。属性
#供StdSchedulerFactory使用的默认属性文件
#创建石英调度程序实例,如果不同的
没有显式指定#属性文件。
#
# 名字
org。石英。调度程序。实例名:DefaultQuartzScheduler
org。石英。调度程序。RMI。导出:假
org。石英。调度程序。RMI。代理:假
org。石英。调度程序。wrappjobexecutionnusertransaction:false
# 实例化线程池时,使用的线程类为简单线程池
org。石英。线程池。类别:org。石英。简单。简单线程池
# 线程总个数
org。石英。线程池。线程数:10
# 线程的优先级
org.quartz。线程池。线程优先级:5
org。石英。线程池。threadsinheritcontextclassloaderofinitializingthread:true
org。石英。工作商店。错误转发阈值:60000
# 持久化方式,默认持久化在内存中,后面我们使用的方式
org。石英。工作商店。类别:org。石英。简单。ramjobstorequation任务持久化到则需要一些官方定义的数据库表,表的结构化查询语言文件可以在石英的冲突包里找到
坐标org.quartz.impl.jdbcjobstore,可以看到里面有很多结构化查询语言文件,有各种数据库的,咱们用关系型数据库的,咱们不需要手动执行结构化查询语言语句,后面咱们在启动项目的时候自动初始化。
创建我们自己的性能文件
# 实例化线程池时,使用的线程类为简单线程池
org。石英。线程池。类别=组织。石英。简单。简单线程池
#线程计数和线程优先级将以作曲者的形式注入线程池实例
# 并发个数
org。石英。线程池。线程数=10
# 优先级
org。石英。线程池。线程优先级=5
org。石英。线程池。threadsinheritcontextclassloaderofinitializingthread=true
org。石英。工作商店。misfrethreshold=5000
#持久化使用的类
org。石英。工作商店。类别=组织。石英。impl。JDBC求职商店。jobstoretx
#数据库中表的前缀
org。石英。工作商店。表格前缀=QRTZ _
#数据源命名
org。石英。工作商店。数据源=qzDS
#qzDS数据源,我们使用hikaricp,默认的是c3p0
org。石英。数据来源。qzds。提供商=hikar ICP
org。石英。数据来源。qzds。driver=com。MySQL。CJ。JDBC。驾驶员
org。石英。数据来源。qzds。URL=JDBC:MySQL://localhost:3306/quartz?使用unicode=真实字符编码=UTF-8服务器时区=GMT+8
org。石英。数据来源。qzds。用户=root
org。石英。数据来源。qzds。密码=123456
org。石英。数据来源。qzds。最大连接数=10既然我们没有使用默认的连接池,那么就探索一下,上源码!在这个包下:org.quartz.utils,有一个PoolingConnectionProvider,顾名思义,连接池提供者部分源码
公共接口池连接提供者扩展ConnectionProvider {
/**池提供者。*/
string POOLING _ PROVIDER=" PROVIDER ";
/* * C3 P0池提供程序。*/
字符串池_提供者_ C3 P0= C3 P0 ;
/**光池提供商。*/
string POOLING _ PROVIDER _ hikari CP= hikari CP ;
}然后hikaripcpoolingconnectionprovider这个类实现了PoolingConnectionProvider,自行查看。我们可以在org.quartz.impl下的StdSchedulerFactory中搜索c3p0找到
if(poolingProvider!=空池提供程序。equals(PoolingConnectionProvider .POOLING_PROVIDER_HIKARICP)) {
CP class= org。石英。utils。hikaripcpoolingconnectionprovider ;
}
否则{
CP class= org。石英。utils。c3p 0 poolingconnectionprovider ;
}剩下的自己多看看吧,起始源码研究起来没有想象中那么难那么乏味(我也不喜欢看源码),但是这个源码看起来确实小有成就感。
回到正题频道,配置应用程序。阳明海运股份有限公司
春天:
数据源:
驱动程序类名称:com.mysql.cj.jdbc.Driver
密码:123456
网址:JDBC:MySQL://localhost:3306/quartz?字符编码=ut F8使用ssl=false服务器时区=GMT+8
用户名:根
石英:
jdbc:
初始化模式:始终
作业存储类型:JDBC initialize-架构:始终每次启动项目,总是初始化数据库表自动创建表的关键地方,流程是先删除数据库表,再创建,如果表不存在,则抛异常,但是不会影响后面的生成表,下次再启动项目的时候,由于表已经存在了,所以不会再抛异常了作业存储类型:jdbc就是任务持久化类型,我们用数据库编程
我们可能要在工作里注入春天对象,不做配置,是无法注入的。
/**
* @作者:taoym
* @日期:2020/6/4 11:32
* @desc:一定要自定义作业工厂重写SpringBeanJobFactory的createJobInstance方法,否则在工作中是获取不到春天容器中的豆的
*/
@组件
公共类作业工厂扩展SpringBeanJobFactory {
@自动连线
私有autowirecablebean factory bean factory;
/**
* 这里覆盖了极好的的createJobInstance方法,对其创建出来的类再进行自动装配
*/
@覆盖
受保护对象createJobInstance(TriggerFiredBundle捆绑包)引发异常{
对象作业实例=超级。createjobinstance(bundle);
豆制品厂。autowirebean(作业实例);
返回作业实例
}
}创建石英的配置文件
@配置
公共类QuartzConfig {
@自动连线
私营工厂作业工厂;
/**
* 读取石英。属性文件
* 将值初始化
*
* @返回
*/
@Bean
公共属性quartzProperties()抛出IOException {
propertiesforybean propertiesforybean=new propertiesforybean();
propertiesfactorybean。设置位置(新的类路径资源(/quartz。属性’);
propertiesforybean。afterpropertiesset();
返回propertiesforybean。getobject();
}
@Bean
公共SchedulerFactoryBean SchedulerFactoryBean()引发IOException {
SchedulerFactoryBean SchedulerFactoryBean=new SchedulerFactoryBean();
schedulerfactorybean。setjobfactory(作业工厂);
schedulerfactorybean。setquartz属性(quartz properties());
返回schedulerFactoryBean
}
/**
* 初始化监听器
*
* @返回
*/
@Bean
公共四进制化器监听器执行器listener(){
返回新的quartizinitializer侦听器();
}
@Bean(name=scheduler )
公共调度程序调度程序()引发IOException {
返回schedulerFactoryBean().get scheduler();
}
}创建触发器组件
公共类触发器组件{
/**
* @作者:taoym
* @日期:2020/6/1 10:35
* @desc:构建时间单位触发器
*/
公共静态触发器cronTrigger(字符串cron) {
触发器生成器。新触发器()。with schedule(cronschedulebuilder。cron调度(cron)).with misprehandlinginstructiondonoothing())。build();
返回克朗触发器
}
公共静态触发器cronTrigger(String cron,JobDataMap jobDataMap) {
触发器生成器。新触发器()。with schedule(cronschedulebuilder。cron调度(cron)).with misprehandlinginstructiondonoothing())。使用作业数据(作业数据映射)。build();
返回克朗触发器
}
}触发器就用这个组件来获取就行了。
创建任务
@DisallowConcurrentExecution
公共类测试作业扩展石英豆{
@覆盖
受保护的void执行内部(JobExecutionContext JobExecutionContext)引发JobExecutionException {
}
}作业执行上下文这里面可以获取任务组、任务名、触发器组、触发器名、工作细节等信息。那个注解是为了让同一个实例(工作详细信息)只能单线程执行。可以这么理解,工作为接口,工作详细信息为实现类,一个是其中一个实现类,一个需要花费100个执行一定的操作,而你给的定时器是没50年代就执行一次操作,一个在执行到一半的时候又需要开启一个线程来执行。使用了不允许并发执行就相当于a没有把操作执行完的时候,一个不允许开启线程再执行当前操作。不知道我的描述是否易懂!
按需创建自己的任务表,我是用定时任务做爬虫的(小爬虫)
创建表`石英_作业`(
` id ` int(11)NOT NULL自动增量注释编号,
` job_name` varchar(50)默认 注释任务名,
` job_group` varchar(50)默认值 注释任务组名称,
` job_desc` varchar(255)默认注释作业描述,
` cron ` varchar(50)DEFAULT COMMENT cron表达式,
状态 tinyint(1)默认 0 注释状态,
` URL varchar(255)默认注释请求地址,
` param` varchar(255) DEFAULT 注释参数,
主键(` id `)
)ENGINE=InnoDB AUTO_INCREMENT=31默认字符集=utf8我们添加任务的时候不和石英打交道,把任务放到数据库即可。别慌,后面有用到他的地方。这个表需要有增删改查操作,我们会在系统中查询任务列表选择单个或者所有任务开始执行
执行任务
@资源
private QuartzJobMapper QuartzJobMapper;
@自动连线
私有调度程序调度程序;
@覆盖
公共字符串开始(整数id) {
job data map job data map=new job data map();
jobDataMap.put(k,v);
QuartzJob QuartzJob=quartzjobmapper。selectbyprimarykey(id);
作业密钥=作业密钥。作业关键字(quartzjob。getjobname()),quartzjob。getjobgroup();
工单明细=工单生成器。新工作(测试工作。类).带有标识(作业关键字).经久耐用()。build();
触发器触发器=触发器组件。cron触发器(quartzjob。getcron()、job data map);
尝试{
调度程序。计划作业(作业详细信息、触发器);
quartzjobmapper。updatestatus(true,id);
返回开始任务执行成功;
} catch(调度异常se){
log.info(开始任务的时候发生了错误);
}
返回开始任务的时候发生了错误,请检查日志;
}最后我又按照此教程上的内容粘贴了一遍代码,可以正常运行。
推荐教程: 《PHP》 以上就是跳趾石英以持久化的方式实现定时任务的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。