单机定时任务很好解决,可以使用引入quartz解决。对于多机分布式定时任务系统可以使用TBSchedule、elastic-job等框架解决。
本文要介绍的是在机器少任务少的情况下的解决方案。比如一个后台项目,只分配了两台服务器。不可能使用其中一台专门做定时任务服务器。
如何解决两机任务分配?
1.思路:在更新事务内,执行select操作谁先获得数据库锁谁先执行,执行完后把信号放到redis.
if(!redisUtil.exist(key)){ Test test =dao.select(“select * from t_test where id=1”); if(!redisUtil.exist(key)){ //do something ...
redisUtil.set(key, 1, time); } }
2.直接使用redis
a.使用redis SETNX
public boolean getRedisLock(String taskName) throws Exception { String taskKey = RedisServiceKeyUtil.taskLock(taskName); Boolean b =redisTemplate.opsForValue().setIfAbsent(taskKey, "1"); if(b!=null && b){ redisTemplate.opsForValue().set(taskKey, "1", 1, TimeUnit.HOURS); return true; } return false; }
b.使用redis INCR 自增序列
public boolean getRedisLock(String taskName){ try { ValueOperations<String, Long> operations = redisTemplateLong.opsForValue(); Long i=operations.increment(taskName, 1); return Long.valueOf(1).equals(i); } catch (Exception e) { e.printStackTrace(); } return false; }
3.使用 zookeeper