spring boot quartz动态定时任务,quartz框架和spring定时任务

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: