如果我使用框架,由于业务需要,我需要在集群服务器上部署它。在测试过程中,我发现定期任务被重复执行。集群服务器共享相同的redis服务器,因此通过redislock锁实现,定期任务只执行一次。
// 这里使用Resourcece 为解决黄叹号提示@Resourceprivate RedisLock redisLock; public void task(){// 获取方法名称--> 该方法要求同类定时任务名称一致 // 若不一致,可使用 自定义ID 来解决 String timerName = this.getClass().getName()+Thread.currentThread() .getStackTrace()[1].getMethodName(); // 这里的定时任务是每小时判断一次 单位是秒 if(redisLock.requireLock(timerName,3600)){ return; } } //自定义 RedisLock @Componentpublic class RedisLock { public final static String MOGUDING_TIMER_LOCK_KEY = "test:lock:lock:"; /** * */ @Resource private RedisTemplate<String, Object> redisTemplate; /** * 判断是否有锁 有:true ;否: false * @param lockName * @param expire 有效时间;单位:秒[不是毫秒] * @return boolean */ public boolean requireLock(String lockName,long expire){ String key = MOGUDING_TIMER_LOCK_KEY+lockName; if(redisTemplate.opsForValue().getAndSet(key,"1")==null){ redisTemplate.expire(key,expire, TimeUnit.SECONDS); return false; }else { return true; } }}这样,如果按照框架定时任务重复执行,就可以简单地解决问题