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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.troy</groupId>
<artifactId>springbootquartz</artifactId>
<version>1.0-SNAPSHOT</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.7.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.5.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.9</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.11.RELEASE</version>
</dependency>
</dependencies>
</project>

  3)基本的yml配置application.yml  

server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/model?useUnicode=true&amp;characterEncoding=utf8
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true

  4)任务配置:TaskConfiguration.class

@Configuration
@EnableScheduling
public class TaskConfiguration { @Bean
public 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<T,I extends Serializable> extends PagingAndSortingRepository<T,I>, JpaSpecificationExecutor<T> {
}
public interface ScheduleJobRepository extends BaseRepository<ScheduleJob,Long> {
List<ScheduleJob> 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> T getBean(Class<T> clazz){
return beanFactory.getBean(clazz);
}
}

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

public class QuartzFactory implements Job {

    @Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//获取调度数据
ScheduleJob scheduleJob = (ScheduleJob) jobExecutionContext.getMergedJobDataMap().get("scheduleJob");
//获取对应的Bean
Object 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 { @Autowired
private SchedulerFactoryBean schedulerFactoryBean;
@Autowired
private ScheduleJobRepository scheduleJobRepository; @Override
public void timingTask() {
//查询数据库是否存在需要定时的任务
List<ScheduleJob> 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{ @Autowired
private ITaskService taskService; /**
* 任务调度开始
* @param strings
* @throws Exception
*/
@Override
public 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 {
@Override
public 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 * * * * ?")
@Override
public void excute() {
System.out.println("注解执行开始==============注解执行开始");
System.out.println(new Date());
System.out.println("注解执行结束==============注解执行结束");
}
}

  3)测试结果为:

  

5、有需要源码的可以自己下载:https://pan.baidu.com/s/1pLSLdTT

利用quartz实现定时调度的更多相关文章

  1. 通过Quartz 配置定时调度任务:使用cron表达式配置时间点

    Cron官网入口 在后台经常需要一些定时处理的任务,比如微信相关应用所需的access_token,就要定时刷新,官方返回的有效性是7200s,也就是2小时,但是为了保险起见,除了在发现access_ ...

  2. Quartz.net 定时调度CronTrigger时间配置格式说明

    1.   CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 ...

  3. Quartz.net 定时调度时间配置格式说明与实例

    格式: [秒] [分] [小时] [日] [月] [周] [年] 序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 ...

  4. ASP.NET Core使用Quartz定时调度

    在应用程序开发过程中,经常会需要定时任务调度功能,本篇博客介绍Asp.net Core如何使用Quartz完成定时调度 一.Quartz使用步骤 创建调度器scheduler,并开启 创建Job作业 ...

  5. 定时调度之Quartz

    工作中我们经常碰到定时或者固定时间点去做一些事情,然后每天到时间点就会去做这样的事情,如果理解这样的场景,我们就要引入今天我们的主角Quartz,其实这个跟数据库的作业类似,但是不仅仅局限于数据库. ...

  6. Spring中实现定时调度

    1,   内容简介 所谓的定时调度,是指在无人值守的时候系统可以在某一时刻执行某些特定的功能采用的一种机制,对于传统的开发而言,定时调度的操作分为两种形式: 定时触发:到某一时间点上执行某些处理操作: ...

  7. springmvc+quartz简单实现定时调度

    一.简介:Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用.Quartz可以用来创建简单或为运行十 ...

  8. 定时调度系列之Quartz.Net详解

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

  9. 定时调度篇之Quartz.Net详解(被替换)

    一. 背景 我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "."每天的0点需要统计前一天的考勤记录"."每个月 ...

随机推荐

  1. go-fasthttp源码分析

    1.架构 listener->server->workerpool 1.1.workerpool中有两种缓存: a.wp.ready,缓存未退出worker, b.worker退出后用sy ...

  2. ThinkPHP中:用户登录权限验证类

    使用CommonAction.class.php公共类,统一判断用户是否登录 <?php //后台登录页 Class CommonAction extends Action{ //后台登录页面 ...

  3. eclipse建立一个jsp项目遇到的问题及解决

    打开eclipse  在workplace 区域空白处,右键 填写好Project name,之后,点击finished 即可. 选中webcontent,新建一个文件夹,并新建一个jsp 文件 新建 ...

  4. python celery 时区&结果(性能)的坑

    本文主要介绍最近使用celery遇到的两个坑.关于时区,以及是否保留结果(celery使用rabbitmq). 先说结论:定时任务记得配置时区:丢弃结果对使用rabbitmq对celery来说,性能提 ...

  5. 运用 finereport 和 oracle 结合开发报表思路大总结

    近排自己学习了一款软件finereport开发报表模块,自己总结了如何了解需求,分析需求,再进行实践应用开发,最后进行测试数据的准确性,部署报表到项目对应的模块中显示. 一.需求(根据需求文档分析) ...

  6. PHP-FPM进程池探秘

    PHP 支持多进程而不支持多线程:PHP-FPM 在进程池中运行多个子进程并发处理所有连接请求.通过 ps 查看PHP-FPM进程池(pm.start_servers = 2)状态如下: root@d ...

  7. Hello World -- 第一篇博客

    今年注定是不寻常的一年,因为技术,接触了许多大牛.通过一篇篇博文,看到了大牛们勤奋好学.孜孜不倦的精神,于是决定也开个博客,向大牛学习. 博客开了,写点什么呢?奈何肚子里墨水不多,吐出来也多是白沫,不 ...

  8. bind、apply与call

    bind.apply与call 先说观点:不论是bind.apply还是call,最大的好处就是代码复用. bind 在开发中,我们只有复用代码时,才会出现this指向需要改动的情况. 纵观bind的 ...

  9. 【网络爬虫入门05】分布式文件存储数据库MongoDB的基本操作与爬虫应用

    [网络爬虫入门05]分布式文件存储数据库MongoDB的基本操作与爬虫应用 广东职业技术学院  欧浩源 1.引言 网络爬虫往往需要将大量的数据存储到数据库中,常用的有MySQL.MongoDB和Red ...

  10. UVa11882,Biggest Number

    搜索+剪枝 如此水的一个题,居然搞了一上午 出错在bfs与dfs时共用了一个vis数组,导致bfs完后返回dfs应该能访问到的点访问不到 自己想怎么剪枝,想了几个剪枝方法,又证明,又推翻,再想,再证明 ...