先说一下我们的系统,
在65和66上分别部署有weblogic节点,共计四个,在项目中我们的定时器会隔一段时间就从其它的五个系统中取数据,这时就出现了问题,本来取一次数据就可以的,现在重复执行了三次,同时还造成了对方服务器的压力。
现在说一下我们项目怎么解决的这个问题:
1、首先想到的是在定时执行任务这个文件中添加ip地址,固定成某一台能执行,但我们一台服务器上有两个节点,方案不可行。
2、后来想到使用redis来保存一个状态位,是1表示可以执行,0表示不可以执行,但要是一个节点get到的是1,在它设置此status为0的时候,另一个节点提前一点点get到的也是1,这个时候这两个节点就都会执行,随后想到可不可以使用redis的事务加watch关键字,细想之后redis的事务是一组命名打包执行,中间不再执行其它操作,也实现不了。
3、既然redis的事务不可以,那数据库的应该可以吧。从而最终找到了现在的解决方案。
能解决的问题:
1、多个节点只有一个节点执行任务
2、即使某个正在执行的节点挂掉了,没有来的及修改状态位,也不影响定时器的执行。