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集群配置涉及到多个步骤,包括选择合适的Job Store、配置Spring集成、定义定时任务以及优化集群设置。正确配置后,我们可以获得高可用和可扩展的定时任务调度系统,满足大规模分布式系统的需求。
总的来说,Spring集成Quartz集群配置是一个涉及到多个组件协同工作的过程,包括Spring容器、Quartz调度器、数据库存储以及集群间的通信。正确配置和使用这些元素可以构建出一个稳定、高可用的定时任务系统。在实际...
本篇文章将深入探讨如何在Spring环境中集成Quartz以构建一个高可用的集群。 首先,我们需要理解Spring和Quartz的核心功能。Spring作为一个全面的Java应用开发框架,提供了依赖注入(DI)、面向切面编程(AOP)以及...
【Spring集成Quartz定时任务与数据库实现集群详解】 在企业级应用中,定时任务的管理是必不可少的一部分,Spring框架提供了与Quartz的集成,使得我们可以方便地创建和管理定时任务。Quartz是一款强大的、开放源代码...
本文章是关于springboot集成quartz集群的步骤,LZ亲测。
2. **集群配置**:配置每个节点的`org.quartz.scheduler.instanceId`为自动获取(`AUTO`),这样Quartz会根据机器的唯一标识自动生成实例ID。 3. **共享状态**:确保所有节点都连接到同一个数据库,并且有相同的...
集成Quartz到Spring的过程中,主要涉及以下步骤: 1. 添加依赖:确保项目中引入了Spring和Quartz的相关库,包括`spring-context-support`和`quartz`。 2. 配置Scheduler:在Spring的配置文件中,使用`...
Quartz与Spring的集成使得在Spring应用中管理任务变得更加容易,可以利用Spring的依赖注入和生命周期管理。 Spring Batch是一个用于处理大量数据的批处理框架。它提供了诸如事务管理、错误处理、读写器和处理器抽象...
总结起来,"Spring+Quartz定时集群支持"涉及到的知识点主要包括:Spring与Quartz的集成、Quartz的集群配置、`MethodInvokingJobDetailFactoryBean`的使用、数据库表的设计以及通过IHS等手段实现的任务调度。...
Spring可以帮助简化Quartz的集成和集群配置。 首先,我们需要在Spring配置文件中定义Quartz的Job和Trigger。`MethodInvokingJobDetailFactoryBean`是一个Spring提供的工厂bean,用于创建一个Job实例,该Job将调用...
二、Spring集成Quartz Spring通过提供QuartzJobBean和MethodInvokingJobDetailFactoryBean等类,使得将Quartz作业与Spring Bean相结合变得简单。我们可以将业务逻辑封装在Spring Bean中,然后通过QuartzJobBean来...
当 Spring 与 Quartz 结合使用时,Spring 可以通过其强大的容器管理和配置能力,将 Quartz 集成到应用程序中。例如,Spring 提供了 `org.springframework.scheduling.quartz` 包,该包包含了一些用于配置 Quartz 的...
在本文中,我们将深入探讨如何在Spring Boot 2.3版本中集成Quartz定时任务,并实现其持久化到数据库,以便支持集群环境。这个过程的关键在于配置Quartz Scheduler,设置数据库连接,以及确保任务在多节点环境中能够...
至于博文链接中的内容,虽然无法直接查看,但通常会包含如何在实际项目中设置Quartz集群和Spring Data集成的详细步骤,包括配置示例、代码示例以及可能遇到的问题和解决方案。 在使用过程中,可能会遇到如任务并发...
通过以上步骤,你就可以在Spring Boot应用中成功集成Quartz,实现动态任务管理和集群支持。在实际业务场景中,你可以根据需求创建更多的Job和Trigger,或者自定义JobDataMap来传递参数。务必注意,对于大型、复杂的...
Quartz是一个开源的作业调度框架,而Spring通过提供一个简洁的API使得与Quartz的集成变得简单。以下是对Spring整合Quartz使用实例的详细说明: 1. **Quartz简介** Quartz是一个强大的、完全开源的作业调度框架,它...
本文将详细讲解如何在Spring Boot项目中集成Quartz定时器,以及如何利用Spring的依赖注入特性来实现Job。 一、集成Quartz定时器 1. 添加依赖:首先,你需要在Spring Boot项目的`pom.xml`或`build.gradle`文件中...