由于项目将要上线,而项目中的Quartz集群配置一直没时间弄,本以为应该是一件挺简单的事,没想到Gooble了一两天才解决问题,主要是因为Spring到3.0.7这个版本为止都没有原生支持Quartz的集群,原来的Quartz配置在单实例下运行正常,配置集群之后各种异常都来了,今天终于配置成功,在这里做一个笔记,避免以后走弯路。
这里要先感谢一下http://blog.csdn.net/lifetragedy/article/details/6212831的博主,在参考了此博客后才得以成功。
首先是任务Bean,可以是一个普通的Service或者Bean
@Service("helloJob")
public HelloServiceImpl implements HelloService{
@Autowired
private HelloDao dao;
public void executeJob(){
List list = dao.findJob();
// TODO:这里实现自己的功能
}
}
第二步创建一个任务代理类DetailQuartzJobBean
public class DetailQuartzJobBean extends QuartzJobBean implements ApplicationContextAware {
protected final Log logger = LogFactory.getLog(getClass());
private String targetObject;
private String targetMethod;
private ApplicationContext ctx;
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
try {
logger.info("execute [" + targetObject + "] at once>>>>>>");
Object otargetObject = ctx.getBean(targetObject);
Method m = null;
try {
m = otargetObject.getClass().getMethod(targetMethod,new Class[] {});
m.invoke(otargetObject, new Object[] {});
} catch (SecurityException e) {
logger.error(e);
} catch (NoSuchMethodException e) {
logger.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;
}
}
这个类是调用Job service的关键
第三步建立Spring quartz配置文件
<!-- 定义任务 -->
<bean id="helloTask" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<!-- 上面的任务代理类 -->
<value>your.package.DetailQuartzJobBean</value>
</property>
<property name="jobDataAsMap">
<map>
<!-- 实际的任务的Bean name,填上HelloServiceImpl的Bean name -->
<entry key="targetObject" value="helloJob" />
<!-- 执行Bean中的哪个方法 -->
<entry key="targetMethod" value="executeJob" />
</map>
</property>
</bean>
<!-- 任务触发器 -->
<bean id="helloTaskTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<!-- 任务代理Bean name -->
<ref bean="helloTask" />
</property>
<property name="cronExpression">
<!-- 配置表达式,这里表示每一分钟执行一次 -->
<value>0 0/1 * * * ?</value>
</property>
<!-- 没有这个会异常 -->
<property name="volatility" value="true" />
</bean>
<!-- 任务调度入口 -->
<bean autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 任务列表,可以配置多个任务加入到该List -->
<property name="triggers">
<list>
<ref local="helloTaskTrigger" />
</list>
</property>
<!-- 数据源,如果Quartz的表位于项目数据源中则可直接使用项目数据源-->
<property name="dataSource" ref="dataSource"></property>
<property name="transactionManager" ref="txManager" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceName">BatchScheduler</prop>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">5</prop>
<prop key="org.quartz.threadPool.threadPriority">5</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.jobStore.class">org.springframework.scheduling.quartz.LocalDataSourceJobStore</prop>
<prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
<prop key="org.quartz.jobStore.isClustered">true</prop>
<prop key="org.quartz.jobStore.useProperties">false </prop>
</props>
</property>
</bean>
最后差点要忘了,得建立Quartz表,quartz的集群同步是通过数据库保证的,所以位于同一个集群中的Quartz必须连接到同一个数据源。
此方法在Spring 3.0.7、Quartz 1.86下测试通过,quartz的建表语句可以从quartz子目录docs\dbTables下找到。
希望本篇笔记能帮到有需要的人。
分享到:
相关推荐
在IT行业中,Spring框架是Java应用开发中的基石,而Quartz则是广泛...通过上述步骤,你已经掌握了Spring集成Quartz集群配置的基本概念。在实践中,根据具体需求调整配置,可以实现高效、稳定且可扩展的任务调度系统。
总结,Spring Quartz集群配置涉及到多个步骤,包括选择合适的Job Store、配置Spring集成、定义定时任务以及优化集群设置。正确配置后,我们可以获得高可用和可扩展的定时任务调度系统,满足大规模分布式系统的需求。
标题 "spring quartz 集群模式" 涉及到的是Spring框架与Quartz调度器在集群环境下的集成和配置。Quartz是一个开源任务调度框架,而Spring则提供了与Quartz的无缝集成,使得在Java应用中管理和执行定时任务变得更加...
java + quartz实现定时任务,实现集群配置,在集群环境下多节点运行定时Quartz定任务,就会存在重复处理任务的现象,为解决这一问题,下面我将介绍使用 Quartz 的 TASK ( 12 张表)实例化到数据库,基于数据库自动...
5. **集群配置**:为了实现高可用的Quartz集群,你需要配置多个节点共享同一个数据库存储的作业和触发器信息。Quartz支持多种持久化策略,如JDBC、RAMJobStore等,选择数据库存储能保证在集群中的任务状态一致性。 ...
在这个“quartz_springbatch_dynamic”项目中,我们将看到如何将这两个强大的工具结合起来,以实现动态集群环境中的定时任务执行,并使用MySQL作为数据存储。 Quartz是一个开源的作业调度框架,允许开发者创建、...
在Spring与Quartz的集成中,Spring可以帮助我们更方便地配置和管理Quartz调度器,通过Spring的bean定义和依赖注入机制,我们可以将作业和触发器声明为bean,然后由Spring容器管理。 要创建一个Spring 4.0.6 + ...
在配置文件中添加: ```xml <bean id="myTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean...
在集群环境下,Spring+Quartz的配置需要考虑如何处理多个服务器节点可能同时执行同一任务的问题。为了解决这个问题,Quartz提供了一种集群模式。当配置为集群模式时,每个节点会共享相同的任务存储(通常是数据库)...
- 考虑使用监控工具(如Prometheus+Grafana)监控Quartz集群的运行状态,以便及时发现和解决问题。 通过以上知识点的学习和实践,开发者可以熟练掌握在Spring环境中使用Quartz实现分布式集群的作业调度,提升系统...
在Quartz集群中,多个Quartz服务器节点共享同一个作业和触发器的信息,当一个节点失败时,其他节点可以接管任务执行,确保服务的连续性。Quartz使用数据库存储作业和触发器的状态,实现集群间的同步。 4. **Spring...
总的来说,将Quartz2.2.1与Spring3.1.1集成并在集群环境中运行,需要深入理解Quartz的配置和Spring的bean管理,同时关注集群的稳定性和容错性。通过合理配置和编程,我们可以创建一个高效、可靠的定时任务执行系统。...
一个基于springboot的quartz集群dome。 向http://localhost:9090/job/addjob注入3个参数 类名:(及时定时任务的类如:com.ybjdw.site.job.NewJob) 组名:随意 定时启动方法:如“0/3 * * * * ?”(每3秒启动一次...
在 Spring Boot + Quartz 集群搭建中,需要注意以下几点: * 时钟同步:需要解决时钟同步问题,避免集群中的节点状态紊乱。 * 集群模式:需要在本地开发环境中使用集群模式,避免破坏集群。 * 线上环境:需要在线上...
在Maven或Gradle的配置文件中,我们需要引入Quartz库以及Spring对Quartz的支持库。这些库将包含所有必要的类和接口,如`Scheduler`, `Job`, `Trigger`等,用于定义和管理定时任务。 接下来,配置Quartz。在Spring的...
在Spring的配置文件中,需要声明SchedulerFactoryBean,配置JobStore类型、数据源以及集群相关参数。同时,还需要定义Job和Trigger,指定对应的Spring Bean和执行时间。 六、案例分析 压缩包中的"spring-quartz...
1. **配置Quartz实例**:在`spring.quartz`下定义Quartz的相关属性,如是否自动启动、线程池大小等。 ```yaml spring: quartz: job-store-type: jdbc auto-startup: true scheduler-instance-id: AUTO ...
当需要在分布式环境中运行多个Quartz实例以实现高可用性和负载均衡时,就需要进行Quartz集群配置。 在Spring集成Quartz的过程中,主要涉及以下几个核心概念和步骤: 1. **Job与Trigger**:Job是Quartz中的任务接口...