Quartz和spring集群定时任务整合.docx
文本预览下载声明
Quartz和Spring整合集群定时任务使用Quartz和spring 整合在集群环境下,大家会碰到一直困扰的问题,即多个?APP?下如何用?quartz?协调处理自动化?JOB?。A?,?B?,?C 3?台机器上各有一个?QUARTZ?,他们会按照即定的?SCHEDULE?自动执行各自的任务。我们先不说实现什么功能,就说这样的架构其实有点像多线程。那多线程里就会存在“资源竞争”的问题,即可能产生脏读,脏写,由于三台?APP SERVER?里都有?QUARTZ?,因此会存在重复处理?TASK?的现象。一般外面的解决方案是只在一台?APP?上装?QUARTZ?,其它两台不装,这样集群就形同虚设了;另一种解决方案是动代码,这样就要影响到原来已经写好的?QUARTZ JOB?的代码了,这对程序开发人员来说比较痛苦;本人仔细看了一下?Spring?的结构和?QUARTZ?的文档,结合?Quartz?自身可以实例化进数据的特性找到了相关的解决方案。每台作为集群点的?APP SERVER?上都可以布署?QUARTZ?;QUARTZ?的?TASK?(?12?张表)实例化如数据库,基于数据库引擎及?High-Available?的策略(集群的一种策略)自动协调每个节点的?QUARTZ?,当任一一节点的?QUARTZ?非正常关闭或出错时,另几个节点的?QUARTZ?会自动启动;3.???????无需开发人员更改原已经实现的?QUARTZ?,使用?SPRING+?类反射的机制对原有程序作切面重构;本人也事先搜索了一些资料,发觉所有目前在?GOOGLE?上或者在各大论坛里提供的解决方案,要么是只解决了一部分,要么是错误的,要么是版本太老,要么就是完全抄别人的。尤其是在使用?QUARTZ+SPRING?对数据库对象作实例化时会抛错(源于?SPRING?的一个?BUG?),目前网上的解决方案全部是错的或者干脆没说,本人在此方案中也会提出如何解决。解决方案:??把?QUARTZ?的?TASK?实例化进数据库,?QUARTZ?只有实例化进入数据库后才能做集群,外面的解决方案说实例化在内存里全部是错的,把quartz-1.8.4/docs/dbTables/tables_oracle.sql?在?ORACLE9I2?及以上版本中执行一下会生成?12?张表;---- A hint submitted by a user: Oracle DB MUST be created as shared and the -- job_queue_processes parameter must be greater than 2, otherwise a DB lock -- will happen. However, these settings are pretty much standard after any-- Oracle install, so most users need not worry about this.---- Many other users (including the primary author of Quartz) have had success-- runing in dedicated mode, so only consider the above as a hint ;-)--delete from qrtz_job_listeners;delete from qrtz_trigger_listeners;delete from qrtz_fired_triggers;delete from qrtz_simple_triggers;delete from qrtz_cron_triggers;delete from qrtz_blob_triggers;delete from qrtz_triggers;delete from qrtz_job_details;delete from qrtz_calendars;delete from qrtz_paused_trigger_grps;delete from qrtz_locks;delete from qrtz_scheduler_state;drop table qrtz_calendars;drop table qrtz_fired_triggers;drop table qrtz_trigger_listeners;drop table qrtz_blob_triggers;drop table qrtz_cron_triggers;drop table qrtz_simple_triggers;drop table qrtz_triggers;drop
显示全部