热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

利用quartz实现定时调度

1、Quartz是OpenSymphony开源组织在Jobscheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。这里我介绍q

1、Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。这里我介绍quartz的两种方式。我这里搭建的框架是采用springboot、spring-data-jpa、mysql、quartz的方式来实现。

2、这里介绍的两种方式是:动态扫描的方式执行和注解的方式。

  至于xml的配置方式可以参考:http://www.cnblogs.com/ll409546297/p/7157702.html

3、动态扫描的方式

  1)基本的目录结构

  

  2)需要的基础包:pom.xml

4.0.0com.troyspringbootquartz1.0-SNAPSHOT

org.apache.maven.pluginsmaven-compiler-plugin1.81.8

org.springframework.bootspring-boot-starter-parent1.5.7.RELEASEorg.springframework.bootspring-boot-starter-web1.5.7.RELEASEorg.springframework.bootspring-boot-starter-data-jpa1.5.7.RELEASEorg.quartz-schedulerquartz2.3.0org.quartz-schedulerquartz-jobs2.3.0mysqlmysql-connector-java5.1.9org.springframeworkspring-context-support4.3.11.RELEASE

  3)基本的yml配置application.yml  

server:port: 8080
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/model?useUnicode=true&characterEncoding=utf8username: rootpassword: rootjpa:hibernate:ddl-auto: updateshow-sql: true

  4)任务配置:TaskConfiguration.class

@Configuration
@EnableScheduling
public class TaskConfiguration {@Beanpublic SchedulerFactoryBean schedulerFactoryBean(){return new SchedulerFactoryBean();}
}

  5)实体需要的基础配置:ScheduleJob.class

@Entity
@Table
public class ScheduleJob {@Id@GeneratedValue(strategy = GenerationType.AUTO)private Long id;private String jobName;private String cronExpression;private String springId;private String methodName;private String jobStatus;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getJobName() {return jobName;}public void setJobName(String jobName) {this.jobName = jobName;}public String getCronExpression() {return cronExpression;}public void setCronExpression(String cronExpression) {this.crOnExpression= cronExpression;}public String getSpringId() {return springId;}public void setSpringId(String springId) {this.springId = springId;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}public String getJobStatus() {return jobStatus;}public void setJobStatus(String jobStatus) {this.jobStatus = jobStatus;}
}

  6)基础数据访问配置和数据访问层:

@NoRepositoryBean
public interface BaseRepository extends PagingAndSortingRepository, JpaSpecificationExecutor {
}

public interface ScheduleJobRepository extends BaseRepository {List findAllByJobStatus(String jobStatus);
}

  7)SpringUtil.class

@Component
public class SpringUtil implements BeanFactoryPostProcessor {private static ConfigurableListableBeanFactory beanFactory;public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {this.beanFactory = beanFactory;}public static Object getBean(String name) {return beanFactory.getBean(name);}public static T getBean(Class clazz){return beanFactory.getBean(clazz);}
}

  8)任务的调度工厂(主要是实现具体的执行)QuartzFactory.class

public class QuartzFactory implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {//获取调度数据ScheduleJob scheduleJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get("scheduleJob");//获取对应的BeanObject object = SpringUtil.getBean(scheduleJob.getSpringId());try {//利用反射执行对应方法Method method = object.getClass().getMethod(scheduleJob.getMethodName());method.invoke(object);} catch (Exception e) {e.printStackTrace();}}
}

  9)具体的任务调度以及触发设置:TaskServiceImpl.class(略过接口)

@Service
@Transactional
public class TaskServiceImpl implements ITaskService {@Autowiredprivate SchedulerFactoryBean schedulerFactoryBean;@Autowiredprivate ScheduleJobRepository scheduleJobRepository;@Overridepublic void timingTask() {//查询数据库是否存在需要定时的任务List scheduleJobs = scheduleJobRepository.findAllByJobStatus("1");if (scheduleJobs != null) {scheduleJobs.forEach(this::execute);}}//添加任务private void execute(ScheduleJob scheduleJob){try {//声明调度器Scheduler scheduler = schedulerFactoryBean.getScheduler();//添加触发调度名称TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName());//设置触发时间CronScheduleBuilder crOnScheduleBuilder= CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression());//触发建立Trigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(cronScheduleBuilder).build();//添加作业名称JobKey jobKey = JobKey.jobKey(scheduleJob.getJobName());//建立作业JobDetail jobDetail = JobBuilder.newJob(QuartzFactory.class).withIdentity(jobKey).build();//传入调度的数据,在QuartzFactory中需要使用jobDetail.getJobDataMap().put("scheduleJob",scheduleJob);//调度作业scheduler.scheduleJob(jobDetail,trigger);} catch (Exception e) {throw new RuntimeException(e);}}
}

  10)然后设置开机启动执行:TaskSchedule.class

@Component
public class TaskSchedule implements CommandLineRunner{@Autowiredprivate ITaskService taskService;/*** 任务调度开始* @param strings* @throws Exception*/@Overridepublic void run(String... strings) throws Exception {System.out.println("任务调度开始==============任务调度开始");taskService.timingTask();System.out.println("任务调度结束==============任务调度结束");}
}

这里基础的配置就算完成了,然后就是在数据库进行相关的配置,项目启动的时候就开始扫描对应的表来执行具体的任务。

这里我写了一下简单的例子来实现。

  1)需要执行的方法:TaskInfoServiceImpl.class(略过接口)

@Service("taskInfo")
@Transactional
public class TaskInfoServiceImpl implements ITaskInfoService {@Overridepublic void execute() {System.out.println("任务执行开始===============任务执行开始");System.out.println(new Date());System.out.println("任务执行结束===============任务执行结束");}
}

  2)数据库的配置(我这里测试用的每分钟0点执行)

  

测试结果:

4、注解的方式

  1)注解的方式相对动态配置来说简单的多,但是不便于管理。注解的方式需要的基础包,和上面基本上差不多

  2)这里我写了一下简单的例子来实现:TaskExcuteServiceImpl.class

@Service
@Transactional
public class TaskExcuteServiceImpl implements ITaskExcuteService {@Scheduled(cron = "30 * * * * ?")@Overridepublic void excute() {System.out.println("注解执行开始==============注解执行开始");System.out.println(new Date());System.out.println("注解执行结束==============注解执行结束");}
}

  3)测试结果为:

  

 

文章参考:https://www.cnblogs.com/ll409546297/p/7793877.html


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Linux下部署Symfoy2对app/cache和app/logs目录的权限设置,symfoy2logs
    php教程|php手册xml文件php教程-php手册Linux下部署Symfoy2对appcache和applogs目录的权限设置,symfoy2logs黑色记事本源码,vsco ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
  • Oracle 和 mysql的9点区别【MySQL】
    数据库|mysql教程oracle,Oracle,money,mysql,coun数据库-mysql教程1.组函数用法规则mysql中组函数在select语句中可以随意使用,但在o ... [详细]
author-avatar
男孩形式恋人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有