先看看quartz的持久化基本介绍:

引用
1 大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz存储job方式就分三种,我们最常用的也是quartz默认的是RAMJobStore,RAMJobStore顾名思义就是把job的相关信息存储在内存里,如果用spring配置quartz的job信息的话,所有信息是配置在xml里,当spirng context启动的时候就把xml里的job信息装入内存。这一性质就决定了一旦JVM挂掉或者容器挂掉,内存中的job信息就随之消失,无法持久化。另外两种方式是JobStoreTX和JobStoreCMT,暂时不讨论这两者的区别,使用这两种JobStore,quartz就会通过jdbc直连或者应用服务器jndi连接数据库,读取配置在数据库里的job初始化信息,并且把job通过java序列化到数据库里,这样就使得每个job信息得到了持久化,即使在jvm或者容器挂掉的情况下,也能通过数据库感知到其他job的状态和信息。      2 quartz集群各节点之间是通过同一个数据库实例(准确的说是同一个数据库实例的同一套表)来感知彼此的。 

由上可见,我们需要创建quartz要用的数据库表,此sql文件在:quartz-1.8.6\docs\dbTables。此文件夹下有各个数据库的sql文件,mysql选择tables_mysql.sql。创建相应表。
接下来新建quartz.properties来覆盖jar包中的此文件,新的properties文件放在src的根目录下即可。下面是文件内容:

  1. #==============================================================
  2. #Configure Main Scheduler Properties
  3. #==============================================================
  4. org.quartz.scheduler.instanceName = quartzScheduler
  5. org.quartz.scheduler.instanceId = AUTO
  6. #==============================================================
  7. #Configure JobStore
  8. #==============================================================
  9. org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
  10. org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
  11. org.quartz.jobStore.tablePrefix = QRTZ_
  12. org.quartz.jobStore.isClustered = true
  13. org.quartz.jobStore.clusterCheckinInterval = 20000
  14. org.quartz.jobStore.dataSource = myDS
  15. #==============================================================
  16. #Configure DataSource
  17. #==============================================================
  18. org.quartz.dataSource.myDS.driver = com.mysql.jdbc.Driver
  19. org.quartz.dataSource.myDS.URL = jdbc:mysql://192.168.20.195:3306/database?useUnicode=true&characterEncoding=UTF-8
  20. org.quartz.dataSource.myDS.user = root
  21. org.quartz.dataSource.myDS.password = 123456
  22. org.quartz.dataSource.myDS.maxConnections = 30
  23. #==============================================================
  24. #Configure ThreadPool
  25. #==============================================================
  26. org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
  27. org.quartz.threadPool.threadCount = 10
  28. org.quartz.threadPool.threadPriority = 5
  29. org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
#==============================================================
#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://192.168.20.195:3306/database?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

可以看到除了数据源、线程池等配置外,我们指定了一个scheduler实例,实例ID为自动分配。

  1. #==============================================================
  2. #Configure Main Scheduler Properties
  3. #==============================================================
  4. org.quartz.scheduler.instanceName = quartzScheduler
  5. org.quartz.scheduler.instanceId = AUTO
#==============================================================
#Configure Main Scheduler Properties
#==============================================================
org.quartz.scheduler.instanceName = quartzScheduler
org.quartz.scheduler.instanceId = AUTO

此外,指定了集群相应配置,检查间隔为20s:

  1. org.quartz.jobStore.isClustered = true
  2. org.quartz.jobStore.clusterCheckinInterval = 20000
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.clusterCheckinInterval = 20000

最后配置applicant-context.xml文件。这里特别要注意一点:

引用
MethodInvokingJobDetailFactoryBean 类中的 methodInvoking 方法,是不支持序列化的,因此在把 QUARTZ 的 TASK 序列化进入数据库时就会抛错。

所以我们要自己实现MethodInvokingJobDetailFactoryBean 的功能,这里用MyDetailQuartzJobBean 替换。

  1. import java.lang.reflect.Method;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import org.quartz.JobExecutionContext;
  5. import org.quartz.JobExecutionException;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.scheduling.quartz.QuartzJobBean;
  8. public class MyDetailQuartzJobBean extends QuartzJobBean {
  9. protected final Log logger = LogFactory.getLog(getClass());
  10. private String targetObject;
  11. private String targetMethod;
  12. private ApplicationContext ctx;
  13. @Override
  14. protected void executeInternal(JobExecutionContext context)
  15. throws JobExecutionException {
  16. try {
  17. logger.info("execute [" + targetObject + "] at once>>>>>>");
  18. Object otargetObject = ctx.getBean(targetObject);
  19. Method m = null;
  20. try {
  21. m = otargetObject.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class});
  22. m.invoke(otargetObject, new Object[] {context});
  23. } catch (SecurityException e) {
  24. logger.error(e);
  25. } catch (NoSuchMethodException e) {
  26. logger.error(e);
  27. }
  28. } catch (Exception e) {
  29. throw new JobExecutionException(e);
  30. }
  31. }
  32. public void setApplicationContext(ApplicationContext applicationContext) {
  33. this.ctx = applicationContext;
  34. }
  35. public void setTargetObject(String targetObject) {
  36. this.targetObject = targetObject;
  37. }
  38. public void setTargetMethod(String targetMethod) {
  39. this.targetMethod = targetMethod;
  40. }
import java.lang.reflect.Method;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean; public class MyDetailQuartzJobBean extends QuartzJobBean {
protected final Log logger = LogFactory.getLog(getClass());
private String targetObject;
private String targetMethod;
private ApplicationContext ctx; @Override
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[] {JobExecutionContext.class});
m.invoke(otargetObject, new Object[] {context});
} 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;
}

终于到配置spring文件这步了

  1. <bean id="mapScheduler" lazy-init="false" autowire="no"
  2. class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  3. <property name="triggers">
  4. <list>
  5. <ref bean="dailyTrigger" />
  6. <ref bean="billCountTrigger" />
  7. <ref bean="userAcctTrigger" />
  8. </list>
  9. </property>
  10. <property name="applicationContextSchedulerContextKey" value="applicationContext" />
  11. <property name="configLocation" value="classpath:quartz.properties" />
  12. </bean>
  13. <bean id="dailyBillJob" class="com.***.job.DailyBillJob" />
  14. <bean id="dailyBillJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
  15. <property name="jobClass">
  16. <value>com.autelan.auteview.lib.util.MyDetailQuartzJobBean
  17. </value>
  18. </property>
  19. <property name="jobDataAsMap">
  20. <map>
  21. <entry key="targetObject" value="dailyBillJob" />
  22. <entry key="targetMethod" value="execute" />
  23. </map>
  24. </property>
  25. </bean>
  26. <bean id="dailyTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  27. <property name="jobDetail">
  28. <ref bean="dailyBillJobDetail" />
  29. </property>
  30. <property name="cronExpression">
  31. <value>11 11 11 * * ?</value>
  32. </property>
  33. </bean>
  34. // 转载请注明出处http://forhope.iteye.com/blog/1398990
<bean id="mapScheduler" lazy-init="false" autowire="no"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="dailyTrigger" />
<ref bean="billCountTrigger" />
<ref bean="userAcctTrigger" />
</list>
</property>
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="configLocation" value="classpath:quartz.properties" />
</bean> <bean id="dailyBillJob" class="com.***.job.DailyBillJob" /> <bean id="dailyBillJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>com.autelan.auteview.lib.util.MyDetailQuartzJobBean
</value>
</property>
<property name="jobDataAsMap">
<map>
<entry key="targetObject" value="dailyBillJob" />
<entry key="targetMethod" value="execute" />
</map>
</property>
</bean> <bean id="dailyTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="dailyBillJobDetail" />
</property>
<property name="cronExpression">
<value>11 11 11 * * ?</value>
</property>
</bean>

Quartz集群配置的更多相关文章

  1. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

    Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...

  2. (4) Spring中定时任务Quartz集群配置学习

    原 来配置的Quartz是通过spring配置文件生效的,发现在非集群式的服务器上运行良好,但是将工程部署到水平集群服务器上去后改定时功能不能正常运 行,没有任何错误日志,于是从jar包.JDK版本. ...

  3. Spring集成quartz集群配置总结

    1.spring-quartz.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE be ...

  4. Spring+quartz 实现定时任务job集群配置

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  5. Spring+quartz 实现定时任务job集群配置【原】

    为什么要有集群定时任务? 因为如果多server都触发相同任务,又同时执行,那在99%的场景都是不适合的.比如银行每晚24:00都要汇总营业额.像下面3台server同时进行汇总,最终计算结果可能是真 ...

  6. Quartz集群原理及配置应用

    1.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: (1) ...

  7. 浅析Quartz的集群配置

    浅析Quartz的集群配置(一) 收藏人:Rozdy     2015-01-13 | 阅:1  转:22    |   来源   |  分享               1 基本信息 摘要:Quar ...

  8. 【原理、应用】Quartz集群原理及配置应用

    一.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: 强大的 ...

  9. quartz集群 定时任务 改成可配置

    前面的博文中提到的quartz集群方式会有以下缺点: 1.假设配置了3个定时任务,job1,job2,job3,这时数据库里会有3条job相关的记录,如果下次上线要停掉一个定时任务job1,那即使定时 ...

随机推荐

  1. AJAX跨域访问(从Tomcat8到Apache/Nginx)

    1.在Tomcat的Root目录下放入如下的文件 apache-tomcat-8.0.12X64\webapps\ROOT clientaccesspolicy.xml文件 <?xml vers ...

  2. Snort - manual 笔记(一)

    Chapter 1 Snort Overview This manual is based on Writing Snort Rules by Martin Roesch and further wo ...

  3. Atitit。Web server Jetty9 使用 attilax 总结

    Atitit.Web server Jetty9 使用 attilax 总结 1.1. 静态文件的资源1 1.2. Servlet使用1 1.3. code1 1.1. 静态文件的资源 WebAppC ...

  4. [Android]RapidFloatingActionButton框架正式出炉

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4474748.html RapidFloatingActionB ...

  5. XMPP学习——2、用户登录

    最近在学习XMPP的使用,打算完成一个完整较为完整地Demo示例,通过这个示例掌握xmpp的使用与开发.同时打算在这个示例中学习使用一下其他的开源类库,在此作为记录学习. 包括服务器端--Openfi ...

  6. Android 短信验证码平台

    1.容联云通讯 (目前只支持国内.收费) http://www.yuntongxun.com/ 2.bmob (目前只支持国内.收费) http://www.bmob.cn/ 3.阿里大鱼(目前只支持 ...

  7. IOS客户端Coding项目记录导航

    IOS客户端Coding项目记录(一) a:UITextField设置出现清除按键 b:绘画一条下划线  表格一些设置 c:可以定义表头跟底部视图(代码接上面) d:隐藏本页的导航栏 e:UIEdge ...

  8. iOS-工作经验+资料分享(长期更新)

    在此记录工作中的一些经验和技术资料 长期更新 欢迎各位业内朋友指正.交流技术上的问题 0.苹果开发联盟电话 4006 701855 1.轻易不用使用tableViewController,因为改变他自 ...

  9. eclipse编码格式设置

    大家好,我是小Alan,很高兴大家能够看到这篇小小的技术点文章,这还是从参加工作以来,小Alan写的第一篇博文.喜欢能够给一些朋友带来方便. 说到eclipse编码格式的设置其实一个非常非常小的事情, ...

  10. linux 中的 tar 解压

    Type at the command prompt tar xvzf file-1.0.tar.gz - tgfo uncompress a gzip tar file (.tgz or .tar. ...