quartz有两种注入方式,MethodInvokingJobDetailFactoryBean和JobDetailBean。
这里我用的是JobDetailBean。(MethodInvokingJobDetailFactoryBean也试了下,无奈不成功,看网上有人说重写两个类文件,试了下也不行,只好用JobDetailBean了)
1.下载quartz-1.8.6包,包的的docs文件夹里有数据库建表sql,quartz集群需要将任务信息实例化到数据库中,然后各个节点从库中读取任务信息。
2.在src中添加quartz.properties文件。
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 10
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.selectWithLockSQL=SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME \= ?
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.dataSource = quartzdataSource
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000
3.src中添加applicationContext-Quartz.xml文件,内容如下,quartz自带的连接池是DBCP,这个连接池问题很多性能也不好,所以改成了c3p0
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="syncSpOriinfoService" class="com.jxet.quartz.service.sms.SyncSpOriinfoService" />
<bean id="syncSpOriinfoBean" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.jxet.quartz.client.SyncSpOriinfoServiceClient
</value>
</property>
<!--采用jobDataAsMap方式进行quartzService注入 -->
<property name="jobDataAsMap">
<map>
<entry key="targetObject" value="syncSpOriinfoService" />
<entry key="targetMethod" value="syncSpOriinfo" />
</map>
</property>
</bean>
<bean id="syncSpOriinfoTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="syncSpOriinfoBean" />
</property>
<!-- 程序启动10秒后运行 -->
<property name="startDelay">
<value>10000</value>
</property>
<!-- 1分钟启动一次 -->
<property name="repeatInterval">
<value>60000</value>
</property>
</bean>
<bean id="quartzdataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<!-- c3p0连接线程池配置文件 --> <property name="driverClass" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="jdbcUrl" value="jdbc:sqlserver://192.168.32.160:1433;databaseName=quartz" />
<property name="user" value="sa" />
<property name="password" value="123" />
</bean>
<bean id="timerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="dataSource">
<ref bean="quartzdataSource" /> <!--Spring中对于的数据源-->
</property>
<property name="configLocation" value="classpath:quartz.properties"/>
<property name="triggers">
<list>
<ref bean="syncSpOriinfoTrigger" />
</list>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
</bean>
</beans>
4.根据 QuartzJobBean 来重写一个自己的类,然后使用 SPRING 把这个重写的类注入 appContext 中后,再使用 AOP 技术反射出原有的 quartzJobx( 就是开发人员原来已经做好的用于执行 QUARTZ 的 JOB 的执行类 ) 。
public class SyncSpOriinfoServiceClient extends QuartzJobBean {
private final Log log = LogFactory.getLog(SyncSpOriinfoServiceClient.class);
@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
try {
log.info("execute [" + targetObject + "] at once>>>>>>");
ApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]{"classpath:applicationContext.xml","classpath:applicationContext-quartz.xml"});
Object otargetObject = ctx.getBean(targetObject);
Method m = null;
try {
m = otargetObject.getClass().getMethod(targetMethod, new Class[]{});
m.invoke(otargetObject, new Object[]{});
}
catch (SecurityException e) {
log.error(e);
}
catch (NoSuchMethodException e) {
log.error(e);
}
}
catch (Exception e) {
throw new JobExecutionException(e);
}
}
private String targetObject;
private String targetMethod;
public void setTargetObject(String targetObject) {
this.targetObject = targetObject;
}
public void setTargetMethod(String targetMethod) {
this.targetMethod = targetMethod;
}
}
5.写业务service(syncSpOriinfoService),然后启动就ok了
需要注意的地方是,程序第一次启动时,会将任务信息实例化到数据库中,以后修改任务信息必须修改数据库中的任务,直接修改项目中的信息是没有用的。看来以后还得整个项目来维护了.
分享到:
相关推荐
总结,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亲测。