当前位置:编程学习 > JAVA >>

Quartz在spring下的动态任务实现

动态任务即为任务在服务启动情况下,动态添加,删除,更新job或者trigger。
网上已经有很多关于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容器管理(线程管理,上下文环境,数据源),果断不能忍受。
2,加入spring-context-support包,调用里面的spring对quartz的封装来实现spring容器对quartz容器的管理。很少有关于这个包进行动态任务添加的资料,于是我便这个包进行阅读了一下。
       说句心里话,看完后,对于这个quartz的封装,有些失望。他只是能够进行文档载入任务执行,不能进行动态任务(没有接口)。唯二的亮点就是能够运行实现runnable的对象任务,不要求任务必须是job接口的实现;另一点是MethodInvokingJobDetailFactoryBean的实现,能够执行任意对象的任一方法(很方便对于没有对象源代码的接口进行任务调度),其实现是使用method invoker,内部类实现job接口。
       迫不得已,我使用schedulerFactoryBean(即spring容器)来管理quartz容器,我使用getobject返回的scheduler对象来进行Quartz的api调用,实现动态调用,解决问题。(我的测试没有遇到问题,如有读者有遇到问题,可以和我交流一下)
------------------------
Quartz的任务调度框架基本整合到这里为止了。下一步工作,由于多个框架的都有自己连接池,需要引入JNDI,来实现多框架连接池的同一调用。
补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,