quartz mysql 分布式_SpringBoot与Quartz集成实现分布式定时任务集群的代码实例

Spring Boot与Quartz集成实现分布式定时任务集群

直接贴代码

POM

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

4.0.0

test.daemon

clusterquartz

0.0.1-SNAPSHOT

jar

clusterquartz

http://maven.apache.org

org.springframework.boot

spring-boot-starter-parent

1.4.1.RELEASE

UTF-8

UTF-8

1.8

org.springframework.boot

spring-boot-starter

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-jdbc

org.springframework.boot

spring-boot-starter-logging

org.springframework

spring-context-support

mysql

mysql-connector-java

com.alibaba

druid

1.0.13

com.h2database

h2

org.quartz-scheduler

quartz

2.2.1

org.quartz-scheduler

quartz-jobs

2.2.1

junit

junit

test

application.yml

server:

port: 80

spring:

datasource:

url: jdbc:mysql://localhost:3306/quartz

username: admin

password: admin

driver-class-name: com.mysql.jdbc.Driver

quartz.properties

#============================================================================

# Configure JobStore

# Using Spring datasource in SchedulerConfig.java

# Spring uses LocalDataSourceJobStore extension of JobStoreCMT

#============================================================================

org.quartz.jobStore.useProperties=false

org.quartz.jobStore.tablePrefix = QRTZ_

org.quartz.jobStore.isClustered = true

org.quartz.jobStore.clusterCheckinInterval = 5000

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.txIsolationLevelReadCommitted = true

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX

org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate

#============================================================================

# Configure Main Scheduler Properties

# Needed to manage cluster instances

#============================================================================

org.quartz.scheduler.instanceName = ClusterQuartz

org.quartz.scheduler.instanceId= AUTO

org.quartz.scheduler.rmi.export = false

org.quartz.scheduler.rmi.proxy = false

org.quartz.scheduler.wrapJobExecutionInUserTransaction = false

#============================================================================

# Configure ThreadPool

# Can also be configured in spring configuration

#============================================================================

#org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

#org.quartz.threadPool.threadCount = 5

#org.quartz.threadPool.threadPriority = 5

#org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

Spring配置类

package test.daemon.clusterquartz.config;

import java.io.IOException;

import java.util.Properties;

import java.util.concurrent.Executor;

import javax.sql.DataSource;

import org.quartz.Scheduler;

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.concurrent.ThreadPoolTaskExecutor;

import org.springframework.scheduling.quartz.CronTriggerFactoryBean;

import org.springframework.scheduling.quartz.JobDetailFactoryBean;

import org.springframework.scheduling.quartz.SchedulerFactoryBean;

import test.daemon.clusterquartz.quartz.QuartzJob;

@Configuration

public class SchedulerConfig {

@Autowired

private DataSource dataSource;

@Bean

public Scheduler scheduler() throws Exception {

Scheduler scheduler = schedulerFactoryBean().getScheduler();

scheduler.start();

return scheduler;

}

@Bean

public SchedulerFactoryBean schedulerFactoryBean() throws IOException {

SchedulerFactoryBean factory = new SchedulerFactoryBean();

factory.setSchedulerName("Cluster_Scheduler");

factory.setDataSource(dataSource);

factory.setApplicationContextSchedulerContextKey("applicationContext");

factory.setTaskExecutor(schedulerThreadPool());

factory.setTriggers(trigger1().getObject());

factory.setQuartzProperties(quartzProperties());

return factory;

}

@Bean

public Properties quartzProperties() throws IOException {

PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();

propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties"));

// 在quartz.properties中的属性被读取并注入后再初始化对象

propertiesFactoryBean.afterPropertiesSet();

return propertiesFactoryBean.getObject();

}

@Bean

public JobDetailFactoryBean job1() {

JobDetailFactoryBean jobDetailFactoryBean = new JobDetailFactoryBean();

jobDetailFactoryBean.setJobClass(QuartzJob.class);

jobDetailFactoryBean.setDurability(true);

jobDetailFactoryBean.setRequestsRecovery(true);

return jobDetailFactoryBean;

}

@Bean

public CronTriggerFactoryBean trigger1() {

CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean();

cronTriggerFactoryBean.setJobDetail(job1().getObject());

cronTriggerFactoryBean.setCronExpression("0/3 * * * * ?");

return cronTriggerFactoryBean;

}

@Bean

public Executor schedulerThreadPool() {

ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

executor.setCorePoolSize(15);

executor.setMaxPoolSize(25);

executor.setQueueCapacity(100);

return executor;

}

}

Quartz job类

package test.daemon.clusterquartz.quartz;

import java.util.Date;

import org.quartz.DisallowConcurrentExecution;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.quartz.PersistJobDataAfterExecution;

import org.springframework.scheduling.quartz.QuartzJobBean;

@PersistJobDataAfterExecution

@DisallowConcurrentExecution

public class QuartzJob extends QuartzJobBean {

@Override

protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

// TODO Auto-generated method stub

System.out.println("\nQuartz job " + new Date());

}

}

Spring Boot启动类

package test.daemon.clusterquartz;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Cluster {

public static void main(String[] args) throws Exception {

SpringApplication.run(Cluster.class, args);

}

}

数据库sql

可以在Quartz的lib中找到适当的数据库生成文件来创建jdbc job store所需要的表。这些表用于Quartz在集群环境中的调度。

一些解释

把项目复制一份,然后改掉spring server的启动端口,启动多个项目,可以观察到只有一个项目的Quartz在运行。如果当前运行Quartz的服务器挂掉,另一台会跟进执行相同的Quartz任务。

有待思考的部分

在Quartz集群环境中,时间的同步是一个重要问题,有时间需要去看一下怎么进行时间同步来确保集群的正确性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SpringBoot实现定时任务可以使用 Quartz 框架。Quartz 是一个开源的作业调度框架,可以用来创建简单或复杂的作业调度程序。 下面是使用 Quartz 实现定时任务的步骤: 1. 添加 Quartz 的依赖 在 pom.xml 文件中添加以下依赖: ```xml <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.0</version> </dependency> ``` 2. 创建 Job 类 创建一个实现 org.quartz.Job 接口的 Job 类。Job 接口只有一个方法 execute(JobExecutionContext context),该方法会在作业执行时被调用。 ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 作业要执行的任务 } } ``` 3. 创建 Trigger Trigger 是定义作业调度时间的组件。可以创建多个 Trigger 对象,每个对象对应一个时间表达式。 ```java Trigger trigger = TriggerBuilder.newTrigger() .withIdentity("triggerName", "groupName") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); ``` 上面的代码创建了一个 Trigger 对象,它的名称是 triggerName,所属的组是 groupName。它使用了一个 Cron 表达式,表示每隔 5 秒执行一次作业。 4. 创建 Scheduler Scheduler 是 Quartz 的核心组件,用于管理和调度作业和触发器。创建一个 Scheduler 对象,然后将 Job 和 Trigger 注册到 Scheduler 中。 ```java SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "groupName") .build(); scheduler.scheduleJob(jobDetail, trigger); scheduler.start(); ``` 上面的代码创建了一个 Scheduler 对象,并使用 JobBuilder 和 TriggerBuilder 创建了一个 JobDetail 对象和一个 Trigger 对象。然后将 JobDetail 和 Trigger 注册到 Scheduler 中,并启动 Scheduler。 完整的代码示例: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { // 作业要执行的任务 } } public class QuartzConfig { @Bean public JobDetail jobDetail() { return JobBuilder.newJob(MyJob.class) .withIdentity("jobName", "groupName") .build(); } @Bean public Trigger trigger() { return TriggerBuilder.newTrigger() .withIdentity("triggerName", "groupName") .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?")) .build(); } @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.scheduleJob(jobDetail(), trigger()); scheduler.start(); return scheduler; } } ``` 在上面的代码中,我们使用了 Spring 的注解 @Bean 来注册 JobDetail、Trigger 和 Scheduler。注意要捕获 SchedulerException 异常。 这样就完成了通过集成 Quartz实现 SpringBoot 定时任务的步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值