quartz是很好与spring结合,进行定时任务控制,但在集群环境下怎么去配置呢?
在集群环境下需要做一下几个步骤:
1、下载quartz相应版本的数据库表(11张),把对应版本的数据库表导入到数据库中
2.在项目src下新建quartz.properties
#============================================================================
# Configure JobStore
# Using Spring datasource in quartzJobsConfig.xml
# Spring uses LocalDataSourceJobStore extension of JobStoreCMT
#============================================================================
org.quartz.jobStore.useProperties=true
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
# Change this to match your DB vendor
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.instanceId=AUTO
org.quartz.scheduler.instanceName=MY_CLUSTERED_JOB_SCHEDULER
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread =true
3、配置quartz.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!-- 配置数据源 -->
<bean id="quartz_dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/weichuxing?characterEncoding=UTF-8" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxActive" value="5" />
<property name="maxIdle" value="3" />
<property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="quartz_transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="quartz_dataSource" />
</bean>
<!-- 服务端定时推送消息给终端 -->
<bean id="serverPushJobTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="cn.xzyd88.event.quartz.ServerPushMessageQuartzSupport" />
<property name="requestsRecovery" value="false"/>
</bean>
<bean id="serverPushTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="serverPushJobTask" />
</property>
<!-- cron表达式 (秒 分 小时 日 月 星期)-->
<property name="cronExpression">
<value>0 */2 * * * ?</value>
</property>
</bean>
<!-- 定义redis同步数据到数据库触发时间 -->
<bean id="redisJobTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="cn.xzyd88.event.quartz.SynchronizationRedisSupport" />
<property name="requestsRecovery" value="false"/>
</bean>
<bean id="redisTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="redisJobTask" />
</property>
<!-- cron表达式 (秒 分 小时 日 月 星期)-->
<property name="cronExpression">
<value>0 */1 * * * ?</value>
</property>
</bean>
<!-- 订单超时处理类 -->
<bean id="delayHandler" class="cn.xzyd88.order.guard.OrderDelayHandler"></bean>
<!-- 定义调用对象和调用对象的方法 -->
<bean id="delayHandlerTask"
class="org.springframework.scheduling.quartz.JobDetailBean">
<!-- 调用的类 -->
<property name="jobClass" value="cn.xzyd88.event.quartz.OderDelayHandlerSupport">
</property>
<property name="requestsRecovery" value="false"/>
</bean>
<!-- 定义触发时间 -->
<bean id="delayHandlerTime" class="com.tool.PersistableCronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="delayHandlerTask" />
</property>
<!-- cron表达式 (秒 分 小时 日 月 星期) 每小时清空一次-->
<property name="cronExpression">
<value>0 */1 * * * ?</value>
</property>
</bean>
<!-- 客服通知定时job -->
<bean id="notificationJob" class="cn.xzyd88.tordercar.TOrderCarRuning">
<property name="mgrTCarRuningService1" ref="mgrTCarRuningService1"></property>
<property name="mgrTOrderCarService1" ref="mgrTOrderCarService1"></property>
<property name="byPhoneService" ref="byPhoneService"></property>
<property name="mgrCustomerService1" ref="mgrCustomerService1"></property>
</bean>
<bean id="notificationTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="cn.xzyd88.event.quartz.NotificationSupport" />
<property name="requestsRecovery" value="false"/>
</bean>
<bean id="notificationTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="notificationTask" />
</property>
<!-- cron表达式 (秒 分 小时 日 月 星期)-->
<property name="cronExpression">
<value>0 0/5 9,23 * * ?</value>
</property>
</bean>
<!-- 企业订单超时处理job -->
<bean id="enterpriseOrderTimeOutJob" class="com.tool.QuartzJob">
<property name="mgrTOrderCancelCountService1" ref="mgrTOrderCancelCountService1"></property>
<property name="mgrTSysparaService1" ref="mgrTSysparaService1"></property>
</bean>
<bean id="enterpriseOrderTimeOutTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="cn.xzyd88.event.quartz.EnterpriseOrderTimeOutSupport" />
<property name="requestsRecovery" value="false"/>
</bean>
<bean id="enterpriseOrderTrigger" class="com.tool.PersistableCronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="enterpriseOrderTimeOutTask" />
</property>
<!-- cron表达式 (秒 分 小时 日 月 星期) 每小时清空一次-->
<property name="cronExpression">
<value>0 0 0/4 * * ? </value>
</property>
</bean>
<bean id="quertz_executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="500" />
</bean>
<bean id="startQuertz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="configLocation" value="classpath:/quartz.properties" />
<property name="dataSource" ref="quartz_dataSource" />
<property name="transactionManager" ref="quartz_transactionManager" />
<property name="schedulerName" value="xzyd_quartzScheduler" />
<property name="overwriteExistingJobs" value="true" />
<property name="startupDelay" value="1"/>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="jobFactory">
<bean class="com.tool.AutowiringSpringBeanJobFactory" />
</property>
<property name="triggers">
<list>
<ref bean="serverPushTrigger" />
<ref bean="redisTrigger" />
<ref bean="notificationTrigger" />
<ref bean="enterpriseOrderTrigger" />
<ref bean="delayHandlerTime" />
</list>
</property>
<property name="jobDetails">
<list>
<ref bean="serverPushJobTask" />
<ref bean="redisJobTask" />
<ref bean="notificationTask" />
<ref bean="enterpriseOrderTimeOutTask" />
<ref bean="delayHandlerTask" />
</list>
</property>
<property name="taskExecutor" ref="quertz_executor" />
</bean>
</beans>
4.重写org.springframework.scheduling.quartz.CronTriggerBean
PersistableCronTriggerFactoryBean.java
package com.tool;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailAwareTrigger;
/**
* Needed to set Quartz useProperties=true when using Spring classes,
* because Spring sets an object reference on JobDataMap that is not a String
*
* @see http://site.trimplement.com/using-spring-and-quartz-with-jobstore-properties/
* @see http://forum.springsource.org/showthread.php?130984-Quartz-error-IOException
*/
public class PersistableCronTriggerFactoryBean extends CronTriggerFactoryBean {
@Override
public void afterPropertiesSet() {
super.afterPropertiesSet();
//Remove the JobDetail element
getJobDataMap().remove(JobDetailAwareTrigger.JOB_DETAIL_KEY);
}
}
5.jobClass 继承QuartzJobBean 重写
EnterpriseOrderTimeOutSupport.java
package cn.xzyd88.event.quartz;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
import com.tool.QuartzJob;
import com.tool.SpringContextUtil;
public class EnterpriseOrderTimeOutSupport extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
QuartzJob quartzJobObj = (QuartzJob) SpringContextUtil.getBean("enterpriseOrderTimeOutJob");
quartzJobObj.work();
}
}
6.把应用部署到不同环境下,进行测试。
- 大小: 3.6 KB
分享到:
相关推荐
本文将深入探讨如何在Spring中配置Quartz以实现集群环境下的任务调度。 首先,我们需要理解Quartz集群的基本概念。在Quartz集群中,多个Quartz服务器共享同一个“作业存储”(Job Store),这个存储可以是关系...
总结来说,构建Quartz集群涉及到数据库的配置、集群监听、公平调度策略、故障转移机制等多个方面。正确配置和理解这些要素,能够确保在分布式环境中,任务调度的高可用性和可靠性。通过持续学习和实践,我们可以根据...
本篇将基于"quartz集群完整应用实例"来深入探讨Quartz的集群配置与实现。 Quartz的核心概念包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是执行的具体任务,Trigger定义了任务何时运行,而...
在IT行业中,Spring框架是Java应用开发中的基石,而Quartz则是广泛...通过上述步骤,你已经掌握了Spring集成Quartz集群配置的基本概念。在实践中,根据具体需求调整配置,可以实现高效、稳定且可扩展的任务调度系统。
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
集群配置是Quartz为了提高系统可用性和任务处理能力而设计的一种模式,它可以确保在一个集群环境中,即使某个节点出现问题,其他节点也能接管任务执行,从而避免数据丢失和任务中断。下面将详细阐述Quartz集群的配置...
在配置Quartz集群时,开发者需要注意以下几点: 1. **数据库兼容性**:确保选择的数据库与Quartz兼容,并正确地配置了数据库驱动。 2. **表初始化**:运行对应的SQL脚本来创建必要的调度表,并确保所有集群节点使用...
标题 "spring quartz 集群模式" 涉及到的是Spring框架与Quartz调度器在集群环境下的集成和配置。Quartz是一个开源任务调度框架,而Spring则提供了与Quartz的无缝集成,使得在Java应用中管理和执行定时任务变得更加...
当需要在分布式环境中运行多个Quartz实例以实现高可用性和负载均衡时,就需要进行Quartz集群配置。 在Spring集成Quartz的过程中,主要涉及以下几个核心概念和步骤: 1. **Job与Trigger**:Job是Quartz中的任务接口...
本解决方案通过将 Quartz 的任务实例化至数据库、合理配置 Quartz 属性文件以及利用 Spring 框架进行重构等手段,有效地解决了集群环境下 Quartz 部署和管理的问题。不仅可以避免任务的重复执行,还能确保系统的高...
在配置Quartz集群时,你需要根据所选择的数据库系统,找到对应的SQL脚本并执行它们来创建所需的表结构。这一步骤是确保Quartz集群能够正确识别和同步任务的关键。此外,还要注意数据库的连接配置,例如数据库URL、...
Quartz集群配置是一项重要的技术,它可以确保在多个服务器之间分布任务,提高系统的可用性和容错性。集群模式下,如果一个节点失败,其他节点可以接管工作,保持服务的连续性。 在Quartz集群配置中,主要涉及以下几...
5. **集群配置**:为了实现高可用的Quartz集群,你需要配置多个节点共享同一个数据库存储的作业和触发器信息。Quartz支持多种持久化策略,如JDBC、RAMJobStore等,选择数据库存储能保证在集群中的任务状态一致性。 ...
Quartz是一款开源的作业调度框架,它允许开发者在Java应用程序中...在部署Quartz集群时,正确地执行这些脚本是成功配置的前提。同时,了解和理解这些表的结构和作用,对于理解和优化Quartz集群的工作机制也至关重要。
本配置手册将详细介绍如何在基于内存的模式下配置Quartz集群,利用Terracotta作为分布式数据管理平台。 首先,Terracotta Job Store for Quartz是Quartz与Terracotta集成的一种解决方案,它允许Quartz作业和触发器...
SpringBoot整合Quartz实现定时任务调度是企业级应用中常见的需求,主要用于自动化执行某些周期性的...在集群环境中,通过配置和Quartz的内置机制,我们可以实现任务的分布式执行和故障恢复,提高系统的稳定性和可靠性。
3. **监控和管理**: 实现对Quartz集群的监控,如任务状态、运行时性能等,以便及时发现和解决问题。 总结,Quartz+Spring的分布式集群调度方案能够帮助开发者构建稳定且可扩展的定时任务系统。通过合理配置和实践,...