本文基于spring3.2+quartz1.8.6配置,参考了网上的实现。
1、创建mysql数据库,执行quartz-1.8.6\docs\dbTables\tables_mysql.sql
2、新建quartz.properties来覆盖jar包中的此文件。
#============================================================== #Configure Main Scheduler Properties #============================================================== org.quartz.scheduler.instanceName = quartzScheduler org.quartz.scheduler.instanceId = AUTO #============================================================== #Configure JobStore #============================================================== org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate org.quartz.jobStore.tablePrefix = QRTZ_ org.quartz.jobStore.isClustered = true org.quartz.jobStore.clusterCheckinInterval = 20000 org.quartz.jobStore.dataSource = myDS #============================================================== #Configure DataSource #============================================================== org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver org.quartz.dataSource.myDS.URL = jdbc:mysql://10.4.247.100:3306/quartz?useUnicode=true&characterEncoding=UTF-8 org.quartz.dataSource.myDS.user = root org.quartz.dataSource.myDS.password = 123456 org.quartz.dataSource.myDS.maxConnections = 30 #============================================================== #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、MethodInvokingJobDetailFactoryBean 类中的 methodInvoking 方法,是不支持序列化的,因此在把 QUARTZ 的 TASK 序列化进入数据库时就会抛错。需要自己实现MethodInvokingJobDetailFactoryBean 的功能,这里用MyDetailQuartzJobBean 替换。
public class MyDetailQuartzJobBean extends QuartzJobBean { protected final Log log = LogFactory.getLog(getClass()); private String targetObject; private String targetMethod; private ApplicationContext ctx; @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { try { //log.info("execute [" + targetObject + "] at once>>>>>>"); Object otargetObject = ctx.getBean(targetObject); Method m = null; try { m = otargetObject.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class}); m.invoke(otargetObject, new Object[] {context}); } catch (SecurityException e) { log.error(e); } catch (NoSuchMethodException e) { log.error(e); } } catch (Exception e) { throw new JobExecutionException(e); } } public void setApplicationContext(ApplicationContext applicationContext) { this.ctx = applicationContext; } public void setTargetObject(String targetObject) { this.targetObject = targetObject; } public void setTargetMethod(String targetMethod) { this.targetMethod = targetMethod; } }
4、编写业务调用类
public class FirstJob implements Job { private final Log log = LogFactory.getLog(this.getClass()); @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { log.info(this.getClass().getName() + "-->" + new Timestamp(System.currentTimeMillis())); } } public class SecondJob implements Job { private final Log log = LogFactory.getLog(this.getClass()); @Override public void execute(JobExecutionContext arg0) throws JobExecutionException { log.info(this.getClass().getName() + "-->" + new Timestamp(System.currentTimeMillis())); } }
5、spring配置文件
<!-- 1、配置文件中添加业务类,该类为调用的工作类 --> <bean id="firstJob" class="cn.sh.ideal.quartz.FirstJob" /> <bean id="secondJob" class="cn.sh.ideal.quartz.SecondJob" /> <!-- 2、定义任务,在spring文件中配置代理类 ,定义调用对象和调用对象的方法--> <bean id="firstTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>cn.sh.ideal.quartz.MyDetailQuartzJobBean</value> </property> <property name="jobDataAsMap"> <map> <entry key="targetObject" value="firstJob" /> <entry key="targetMethod" value="execute" /> </map> </property> </bean> <bean id="secondTask" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass"> <value>cn.sh.ideal.quartz.MyDetailQuartzJobBean</value> </property> <property name="jobDataAsMap"> <map> <entry key="targetObject" value="secondJob" /> <entry key="targetMethod" value="execute" /> </map> </property> </bean> <!-- 3、配置触发器,定义触发时间,可以根据不同的时间对同一个任务定义多个触发器,下面是每隔10秒调用一个方法配置--> <!-- cron表达式 --> <bean id="firstCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="firstTask"/> <property name="cronExpression" value="10,20,30,40,50 * * * * ?"/> </bean> <bean id="secondCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="secondTask"/> <property name="cronExpression" value="5,15,25,35,45,55 * * * * ?"/> </bean> <!-- 4、配置调度器 ,容器启动就会执行调度程序 --> <!-- 总管理类,如果lazy-init='false',则容器启动时就会执行调度程序--> <!-- 如果lazy-init='true',则需要实例化该bean才能执行调度程序 --> <bean id="schdulerFactory" lazy-init="true" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="firstCronTrigger"/> <ref bean="secondCronTrigger"/> </list> </property> <property name="applicationContextSchedulerContextKey" value="applicationContext" /> <property name="configLocation" value="classpath:quartz.properties" /> </bean>
参考文档
1、Quartz集群配置 http://forhope.iteye.com/blog/1398990
2、quartz在集群环境下的最终解决方案 http://blog.csdn.net/lifetragedy/article/details/6212831
3、spring结合quartz的执行多任务的实现 http://rongdmmap-126-com.iteye.com/blog/1434378
4、cronmaker http://www.cronmaker.com/
5、Quartz学习研究 http://blog.csdn.net/jinnchang/article/details/8185786
相关推荐
总结,Spring Quartz集群配置涉及到多个步骤,包括选择合适的Job Store、配置Spring集成、定义定时任务以及优化集群设置。正确配置后,我们可以获得高可用和可扩展的定时任务调度系统,满足大规模分布式系统的需求。
在IT行业中,Spring框架是Java应用开发中的基石,而Quartz则是广泛...通过上述步骤,你已经掌握了Spring集成Quartz集群配置的基本概念。在实践中,根据具体需求调整配置,可以实现高效、稳定且可扩展的任务调度系统。
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
总结,Quartz集群配置涉及到数据库、配置文件、Job和Trigger的定义,以及集群监听器的设置。通过这些配置,可以实现任务的高可用性和并发控制,提高系统的整体稳定性。示例源码通常会展示如何创建Job、Trigger,以及...
当需要在分布式环境中运行多个Quartz实例以实现高可用性和负载均衡时,就需要进行Quartz集群配置。 在Spring集成Quartz的过程中,主要涉及以下几个核心概念和步骤: 1. **Job与Trigger**:Job是Quartz中的任务接口...
Quartz集群配置是一项重要的技术,它可以确保在多个服务器之间分布任务,提高系统的可用性和容错性。集群模式下,如果一个节点失败,其他节点可以接管工作,保持服务的连续性。 在Quartz集群配置中,主要涉及以下几...
在分布式环境中,尤其是在高可用性和负载均衡需求的场景下,Quartz可以通过集群配置实现任务的共享和均衡。本配置手册将详细介绍如何在基于内存的模式下配置Quartz集群,利用Terracotta作为分布式数据管理平台。 ...
Quartz 的集群配置是其高级特性之一,它允许在多个节点上分布式的调度和执行任务,以提高系统的可用性和容错性。在集群环境中,每个节点都是 Scheduler 的实例,它们共享相同的调度信息,并且能够处理其他节点失败时...
Quartz的集群配置允许在多台服务器上部署,以提高任务调度的稳定性和可靠性。 在Java软件开发中,任务调度是一个常见的需求,例如论坛的RSS生成、积分排名统计和用户锁定任务的解锁。这些任务的执行通常涉及到多...
Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup Language)配置文件,使得配置更加直观和灵活。以下将详细介绍如何在Spring Boot应用中使用YAML文件配置Quartz定时任务,以及...
总结来说,构建Quartz集群涉及到数据库的配置、集群监听、公平调度策略、故障转移机制等多个方面。正确配置和理解这些要素,能够确保在分布式环境中,任务调度的高可用性和可靠性。通过持续学习和实践,我们可以根据...
Quartz集群配置主要包括以下几个关键部分: 1. **配置集群节点**:每个节点都需要在配置文件(通常是`quartz.properties`)中声明它是集群的一部分,并指定唯一的节点ID。 2. **选择合适的Job Store**:使用支持...
3. **集群配置**:在quartz.properties配置文件中,设置`org.quartz.jobStore.isClustered=true`以启用集群模式。 4. **节点标识**:每个节点需要一个唯一的识别符(`org.quartz.scheduler.instanceId`),通常是'...
本篇将基于"quartz集群完整应用实例"来深入探讨Quartz的集群配置与实现。 Quartz的核心概念包括Job(任务)、Trigger(触发器)和Scheduler(调度器)。Job是执行的具体任务,Trigger定义了任务何时运行,而...
2. **集群配置**:配置每个节点的`org.quartz.scheduler.instanceId`为自动获取(`AUTO`),这样Quartz会根据机器的唯一标识自动生成实例ID。 3. **共享状态**:确保所有节点都连接到同一个数据库,并且有相同的...
集成Quartz集群需要配置Quartz的集群模式,包括共享的数据存储(如数据库)、集群节点间的通信机制(如JDBC Job Store)以及对Job和Trigger的一致性处理。在实际应用中,可能会使用如ZooKeeper这样的分布式协调服务...
本文章是关于springboot集成quartz集群的步骤,LZ亲测。