网上已经有很多关于Quartz+spring的实现方案,但是这些都是关于启动时加载XML或其他配置文件,将任务加载到Quartz中去执行,没有关于如何彻底动态操作任务(job+trigger)。
我的工作是将Quartz添加到spring中去,步骤:
1,引入quartz-x.x.x包。不考虑spring容器,但是依旧是在spring 容器下实现。自己的服务直接调用quartz的api,即可实现动态任务。
quartz的文档(example,配置)很丰富,很容易实现。对于quartz.properties文件添加属性,逐步修改,测试。很容易实现RAMStore到JDBCStore的转变,集群。其他一些关于任务优先级控制,misfire设置,状态保持,请求恢复,任务完成后是否自动删除等特征,需要修改部分程序即可实现。
我在这个过程中,碰到的问题主要有quartz容器的启动和删除,启动我可以通过spring的bean设置来实现,但是删除不会实现,虽说我知道就是调用scheduler的shutdown函数即可(后来知道怎么实现,实现DisposableBean接口)。但是不依赖spring,使得这个quartz容器是在spring容器里面,但是不受spring容器管理(线程管理,上下文环境,数据源),果断不能忍受。
说句心里话,看完后,对于这个quartz的封装,有些失望。他只是能够进行文档载入任务执行,不能进行动态任务(没有接口)。唯二的亮点就是能够运行实现runnable的对象任务,不要求任务必须是job接口的实现;另一点是MethodInvokingJobDetailFactoryBean的实现,能够执行任意对象的任一方法(很方便对于没有对象源代码的接口进行任务调度),其实现是使用method invoker,内部类实现job接口。
迫不得已,我使用schedulerFactoryBean(即spring容器)来管理quartz容器,我使用getobject返回的scheduler对象来进行Quartz的api调用,实现动态调用,解决问题。(我的测试没有遇到问题,如有读者有遇到问题,可以和我交流一下)
------------------------
Quartz的任务调度框架基本整合到这里为止了。下一步工作,由于多个框架的都有自己连接池,需要引入JNDI,来实现多框架连接池的同一调用。