java web开发当中常用到定时任务,说到定时任务相信你一定或多或少了解quartz。在单台应用服务器上配置spring + quartz没有什么问题,这样的文章网络上应该也有很多,但是当你把应用放到集群环境中则会出问题,每台服务器上的定时任务并不知道其他服务器上的定时 任务的存在,各自执行产生资源竞争,可能就会导致出现脏数据。
本篇文章讲解了如何在集群环境中配置定时任务,用到的是spring4 + quartz2.2.1,下面请跟我一步一步进行配置。
如果你使用maven,添加引入;否则可以官网下载最新包。
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
1.新建定时任务执行java类TestJob,集成了QuartzJobBean并实现了executeInternal方法。
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJob extends QuartzJobBean{
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
System.out.pringln("定时任务执行成功");
}
}
2.新建quartz.xml配置文件,并在spring配置文件中添加quartz.xml。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
定时任务,此处使用JobDetailFactoryBean而非MethodInvokingJobDetailFactoryBean,是因为MethodInvokingJobDetailFactoryBean存在序列化bug。
如果你的项目中使用了MethodInvokingJobDetailFactoryBean,并且不想对此进行修改,可以草考该篇文章:http://mushme.iteye.com/blog/1874370
-->
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="你的项目包路径.TestJob" />
</bean>
<!--
定义job执行逻辑,此处定义0 0 6,20 * * ?,表示每天上午6点,下午8点执行。具体配置方法请自行搜索cronExpression
-->
<bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" />
<property name="cronExpression" value="0 0 6,20 * * ?" />
</bean>
<!-- 总调度用于启动Spring定时器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--
虽然terracotta买下了quartz,quartz已经支持terracotta集群配置,但是此篇文章依旧使用数据库支持quartz集群的方式
项目已经配置了数据源,此处直接引用
-->
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContextKey"/>
<!-- quartz配置文件 -->
<property name="configLocation" value="classpath:quartz.properties" />
<property name="triggers">
<list>
<ref bean="jobTrigger" />
</list>
</property>
</bean>
</beans>
在spring配置文件中引入quartz.xml。
3.上面的配置文件中引入了quartz.properties,我们在src下新建此文件,并加入以下内容。
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
#\u552F\u4E00\u6807\u8BC6\uFF0C\u540C\u4E00\u4E2A\u96C6\u7FA4\u7684\u540D\u79F0\u5FC5\u987B\u4E00\u81F4
org.quartz.scheduler.instanceName = MyClusteredScheduler
#auto\uFF0C\u5219quartz\u4F1A\u6839\u636E\u65F6\u95F4\u548C\u4E3B\u673A\u540D\u751F\u6210\uFF0C\u786E\u4FDD\u552F\u4E00
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
#jobstoretx\u5219\u4EFB\u52A1\u4F1A\u88AB\u6301\u4E45\u5316\u5230\u6570\u636E\u4E2D\uFF0C\u9ED8\u8BA4\u4E3ARAMJobStore\uFF0C\u9ED8\u8BA4\u4F1A\u88AB\u7EF4\u62A4\u5230\u5185\u5B58\u4E2D\uFF0C\u96C6\u7FA4\u7684\u65F6\u5019\u5FC5\u987B\u4FEE\u6539
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
#ture\u5219\u6B64\u5B9E\u4F8B\u9700\u8981\u53C2\u52A0\u5230\u96C6\u7FA4\u4E2D
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
4.此篇文章讲的是基于数据库的quartz集群,还缺少quartz集群所需要的表,在最新的quartz包中可以找到建表sql,如果你闲麻烦,那就找找文本的附件吧。
当你创建了quartz集群锁需要的表,并且进行了以上配置,就可以启动项目验证quartz集群是否可以正常运行了。
PS:有不明白的地方欢迎留言,如果此篇文章对你有帮助请赞一下,欢迎分享。
分享到:
相关推荐
spring 集成quartz定时任务 用数据库实现quartz的集群
本文章是关于springboot集成quartz集群的步骤,LZ亲测。
springboot 集成 quartz 集群 加 sql 等 文章介绍 单机加集群都有 https://blog.csdn.net/weixin_42749765/article/details/88532413
spring 集成 quartz ,支持集群,job支持spring@Autowired注入及@Resource注入
NULL 博文链接:https://fanshuyao.iteye.com/blog/2392350
针对Quartz与Spring做集群的Demo实例,主要解决了Quartz的JOB序列化问题。 源代码说明: support pkg:扩展Spring与Quartz集成的不足之处。 core pkg: 是自身调度业务的封装 实例运行依赖Oracle数据库,根据quartz...
1,如果只是集成spring和quartz,则只需要jar包,和编写配置文件,即可。 2,如果考虑集群部署,会用到tables_mysql.sql。
用户管理:用户是系统操作者,该功能主要完成系统用户配置。 部门管理:配置系统组织机构(公司、部门、小组),树结构展现。 岗位管理:配置系统用户所属担任职务。 菜单管理:配置系统菜单,操作权限,按钮权限...
该项目包含helloworld(快速入门)、web(ssh项目快速搭建)、aop(切面编程)、data-redis(redis缓存)、quartz(集群任务实现)、shiro(权限管理)、oauth2(四种认证模式)、shign(接口参数防篡改重放)、encoder(用户...
quartz|[Spring Scheduler,Quartz,分布式调度,集群,mysql持久化等](https://github.com/smltq/spring-boot-demo/blob/master/quartz/HELP.md) shiro|[授权、认证、加解密、统一异常处理]...
2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 ...
2.2.3 类包及Spring配置文件规划 2.3 持久层 2.3.1 建立领域对象 2.3.2 UserDao 2.3.3 LoginLogDao 2.3.4 在Spring中装配DAO 2.4 业务层 2.4.1 UserService 2.4.2 在Spring中装配Service 2.4.3 单元测试 2.5 展现层 ...
比如:使用Spring框架集成quartz,只需要进行一些简单的配置就能定时执行任务了。但是随着企业的系统越来越多、逐步从单一应用慢慢演变为微服务集群。 在分布式集群系统中主要面临出如:任务的重复执行、没有统一定时...
项目信息:此项目是基于...整合了 quartz 定时任务框架 ,并进行了封装,只需在构建完定时任务Job类后,在 application-quartz.properties 配置文件中进行简单配置即可;实现了 reids 分布式锁 ,当项目部署集群时,
Spring+SpringMVC+Mybatis框架集成公共模块,包括公共配置、MybatisGenerator扩展插件、通用BaseService、工具类等。 > zheng-admin 基于bootstrap实现的响应式Material Design风格的通用后台管理系统,`zheng`...
基于springboot2.0,以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为分布式集群调度,JSP作为前端页面引擎,采用...
以Spring Framework为核心容器,Spring MVC为模型视图控制器,Mybatis Plus为数据访问层, Apache Shiro为权限授权层, Redis为分布式缓存,Quartz为分布式集群调度,layui作为前端框架并进行前后端分离的开源框架。...