Cron4jPlugin定时插件在多tomcat的负载均衡中会执行多次
咨询下,用Cron4jPlugin定时配置定时任务,在多tomcat的负载均衡中会多次的执行,有没有其他方式来解决这个问题,只想执行一次?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
咨询下,用Cron4jPlugin定时配置定时任务,在多tomcat的负载均衡中会多次的执行,有没有其他方式来解决这个问题,只想执行一次?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
回复真是太及时了,简直秒回,感谢波总,我试试。
回复
@gaopeng8 : 代码刚刚被改进过,上一次的少一个 if 判断: // 只有 lock 更新成了自己生成的 lock 值,才能表明被自己抢到了 if (task.getLock().equals(lock) { return task; } 注意再回看一下代码
利用数据库或者 redis 担当一个共享数据的地方,让多个 Cron4jPlugin 去共享数据库或共享的 redis 中去取要调度的任务
例如使用 mysql 数据库, 建一张 task 表, 其中有下面字段:
task(id, cron, class, lock)
其中 id 是任务 id,cron 是任务调度用的表达式,lock 是抢占该任务的锁,关键在于如何抢点锁,下面是示例代码:
上面的 getTask 方法可能会返回 null,这是由于多进程/线程会有争抢的情况出现,可以使用在 for 循环中执行该 getTask() 方法重试抢几次的策略
如果还觉得并发下不保险,可以在上面代码中添加事务:
最后,通过 getTask() 得到 Task 对象以后,取出 Task 中的 cron 表达式以及 class 值来 new Cron4jPlugin(...).start()