spring + quartz 动态添加job的问题

久欠幸福 发布于 2015/03/05 11:32
阅读 1K+
收藏 1
产品提了一个可以动态添加报警服务的需求,之前的报警任务都是配置在spring的配置文件中写死的,现在要求可以动态添加、修改、删除,这几天在网上查了一下 spring 3.1 (及以上)+ quartz 2.0(以上)版本 可以支持动态添加,入库(服务重启后可以从数据库中读取任务) , 但是遇到一个问题,我们的服务是同时部署在2台服务器上的,为了保持负载均衡,这样就导致在动态添加job的时候 就不能确定请求落在哪台服务器上,导致了一个不一致的问题,而且如果服务重启,2台服务器同时从数据库中读取任务,就导致任务多次执行的问题,大家有没有什么好的方法解决这个问题
加载中
0
Jack_Q
Jack_Q
把job独立成服务模块。业务通过RPC,http,webservice等方式访问与job模块交互。
Jack_Q
Jack_Q
回复 @Black_JackQ : 或者简单除暴的,在copy一个应用启动,这个应用就负责JOB,哈哈。
Jack_Q
Jack_Q
回复 @久欠幸福 : 那可以通过2个服务的JOB加入到一组信息监听里,如果到时间,从监听中去一个JOB执行。大概的一个思路。可以参考jgroups的状态传输。
久欠幸福
久欠幸福
这种方案是最好的,但是产品那关过不了
0
readshe
readshe
搞个配置文件 控制下 启动定时任务的开关,一台服务器 开启 ,运行定时任务,一台服务器 关闭定时任务。然后,增加定时任务日志,通过日志来监控 定时任务的直行状态。
0
readshe
readshe
在页面控制下添加任务功能的权限,只有开启任务的服务器能动态添加任务,关闭任务等操作。
readshe
readshe
回复 @久欠幸福 : 前台页面控制了权限,只有有权限的服务器才能删除任务,和负载没关系。
久欠幸福
久欠幸福
配置文件可以做成一个服务器有任务的,另一个没有,但是在增删改查任务的时候 发送请求的时候 并不能确定请求是落在哪个服务器上的,因为在服务器之前有个nginx做了负载均衡,所以请求有可能落在没有任务的服务器上
0
maradona
maradona

quartz有他的持久化的方案的吧,看起来有点复杂(懒得大改),所以自己参考资料写了一个简单的,根据数据库锁保证只有同一时间只有一台服务器跑(多台服务器时间不一致那就可能会跑多次,但不会影响业务),加了两张表一张日志,一张job表

支持手动加载(作用不大...),手动运行(感觉唯一有价值的)

0
牛牛-豆豆
牛牛-豆豆
quartz本身就支持持久化的,完全可以避免多应用跑多次的
0
Mr_Jin
Mr_Jin

2.x版本 已经自带集群功能

http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

返回顶部
顶部