spring + quartz 动态添加job的问题
产品提了一个可以动态添加报警服务的需求,之前的报警任务都是配置在spring的配置文件中写死的,现在要求可以动态添加、修改、删除,这几天在网上查了一下 spring 3.1 (及以上)+ quartz 2.0(以上)版本 可以支持动态添加,入库(服务重启后可以从数据库中读取任务) , 但是遇到一个问题,我们的服务是同时部署在2台服务器上的,为了保持负载均衡,这样就导致在动态添加job的时候 就不能确定请求落在哪台服务器上,导致了一个不一致的问题,而且如果服务重启,2台服务器同时从数据库中读取任务,就导致任务多次执行的问题,大家有没有什么好的方法解决这个问题
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(10)
2.x版本 已经自带集群功能
http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
quartz有他的持久化的方案的吧,看起来有点复杂(懒得大改),所以自己参考资料写了一个简单的,根据数据库锁保证只有同一时间只有一台服务器跑(多台服务器时间不一致那就可能会跑多次,但不会影响业务),加了两张表一张日志,一张job表
支持手动加载(作用不大...),手动运行(感觉唯一有价值的)
配置文件可以做成一个服务器有任务的,另一个没有,但是在增删改查任务的时候 发送请求的时候 并不能确定请求是落在哪个服务器上的,因为在服务器之前有个nginx做了负载均衡,所以请求有可能落在没有任务的服务器上
回复
前台页面控制了权限,只有有权限的服务器才能删除任务,和负载没关系。
在页面控制下添加任务功能的权限,只有开启任务的服务器能动态添加任务,关闭任务等操作。
搞个配置文件 控制下 启动定时任务的开关,一台服务器 开启 ,运行定时任务,一台服务器 关闭定时任务。然后,增加定时任务日志,通过日志来监控 定时任务的直行状态。
这种方案是最好的,但是产品那关过不了
回复
那可以通过2个服务的JOB加入到一组信息监听里,如果到时间,从监听中去一个JOB执行。大概的一个思路。可以参考jgroups的状态传输。
回复
或者简单除暴的,在copy一个应用启动,这个应用就负责JOB,哈哈。
把job独立成服务模块。业务通过RPC,http,webservice等方式访问与job模块交互。