1、Oracle

思路:Insert表内容时,主键重复,无法插入

范围:适用于执行频率低的定时任务

方法:新建一张任务执行表,每次执行定时任务之前先insert该表。

比如:每天执行一次批处理操作。主键可以设置为批处理name+日期(年月日)。集群服务器可能会同时去insert该表,而只有一台服务器能插入成功,则只让这一台服务器执行该批处理任务。

2、Redis

范围:适用于执行频率高的定时任务

有如下两种思路方法:

思路1:采用的是redis中list的push和pop操作。因为Redis是单线程,所有命令依次执行,所以不会出现多台服务器同时访问的情况。

方法:系统初始化时,向Redis中lpush一个list(key,1),作为标识Flag。每台服务器执行批处理之前,先去rpop该list,只有获取到该标识的服务器才能执行批处理任务,执行完毕后再lpush回一个list(key,1)。

比如:执行任务前先执行rpopRedisFlag,任务完成后执行lpushRedisFlag.

public class AutoJobActDis extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext arg0) throws JobExecutionException                         {if (rpopRedisFlag("AUTO_JOB_ACTDIS")) {this.executeJob(this);lpushRedisFlag("AUTO_JOB_ACTDIS");}}/*** 从缓存中取得Flag,获取定时任务执行权限** @param redisKey* @return*/public boolean rpopRedisFlag(String redisKey) {String redisValue = redisService.rpopRedisList(redisKey);if (StringUtil.isEmpty(redisValue)) {return false;} else {return true;}}/*** 缓存中增加Flag** @param redisKey*/public void lpushRedisFlag(String redisKey) {redisService.lpushRedisList(redisKey, "1");}
}public class RedisService {/*** 存储Redis队列,顺序存储* @param key redis键名* @param value 键值*/public void lpushRedisList(String key, String value) {Jedis jedis = null;try {jedis = jedisClient.getClient();jedis.lpush(key, value);} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}}/*** 移除并获取列表最后一个元素* @param key* @return*/public String rpopRedisList(String key) {Jedis jedis = null;try {jedis = jedisClient.getClient();return jedis.rpop(key);} catch (Exception e) {logger.error(e.getMessage(), e);} finally {if (jedis != null) {jedis.close();}}return null;}
}

思路2:采用的是redis中String的incr和expire操作。因为Redis是单线程,所有命令依次执行,所以不会出现多台服务器同时访问的情况。

语法:INCR key  将 key 中储存的数字值增一。

Redis Incr 命令将 key 中储存的数字值增一。

如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。

如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。

本操作的值限制在 64 位(bit)有符号数字表示之内。

EXPIRE key seconds  为给定 key 设置过期时间。

Redis Expire 命令用于设置 key 的过期时间。key 过期后将不再可用。

方法:每台服务器执行批处理之前,先去incr一个固定key,只有返回值等于1的服务器才能执行批处理任务,然后将该key值设置过期时间。

比如:

         jedis = jedisTool.getJedis();if(jedis.incr(PRE_AGAIN_REDIS+batchId)!=1) {logger.info("其他机器已经重跑");return ;} else {jedis.expire(PRE_AGAIN_REDIS+batchId, 60);//设置60s过期}

集群服务器中定时任务多次执行的解决方案相关推荐

  1. nc 模拟服务器_NC集群服务器使用详解

    NC 集群服务器使用详解 NC220 发版时,对中间件做了一项重大改进,对集群服务器应用提供了全面解决方案 的支持, 使产品更加能够适应集团企业的大规模应用. 本文力争以通俗的语言, 描述集群服 务器 ...

  2. 集群部署中解决定时任务重复执行的问题-redis分布式锁应用

    背景描述 有小伙伴私信我,关于存在定时任务的项目在集群环境下部署如何解决重复执行的问题,PS:定时任务没有单独拆分. 概述:之前的项目都是单机器部署,所以定时任务不会重复消费,只会执行一次.而在集群环 ...

  3. 集群服务器定时任务重复执行的解决方案

    集群服务器定时任务重复执行的解决方案 服务器采用了负载均衡,有两台服务器,部署的代码一样,所以里面的定时任务在某一时间会被同时执行,这就导致了很多其他意外的发生,想要解决的问题基本就三个:单点执行,故 ...

  4. 集群服务器下使用SpringBoot @Scheduled注解定时任务

    原文:https://blog.csdn.net/huyang1990/article/details/78551578 SpringBoot提供了 Schedule模块完美支持定时任务的执行 在实际 ...

  5. 集群服务器状态命令------rs.status()各个字段的含义

    可根据rs.status() 查询集群服务器状态. 字段解释: self 这个信息出现在执行rs.status()函数的成员信息中 stateStr用户描述服务器状态的字符串.有SECONDARY,P ...

  6. 《Reids 设计与实现》第十五章 集群(中)

    <Reids 设计与实现>第十五章 集群(中) 文章目录 <Reids 设计与实现>第十五章 集群(中) 四.在集群中执行命令 1.计算键属于哪个槽 2.判断槽是否由当前节点负 ...

  7. powerha_在IBM PowerHA集群环境中实现存储数据的服务器端缓存

    本文介绍了如何将IBMPowerHA®集群配置为使用定制的应用程序脚本为应用程序提供高可用性(HA)时,如何在IBM®AIX®操作系统上启用服务器端存储数据缓存 . AIX提供AIX 7.1 TL4 ...

  8. Redis 集群规范(中文稿)(MOVED错误码及ASK错误码

    引言? 这个文档是正在开发中的 Redis 集群功能的规范(specification)文档,文档分为两个部分: 第一部分介绍目前已经在 unstable 分支中实现了的那些功能. 第二部分介绍目前仍 ...

  9. 什么是服务器集群?集群服务器有什么好处

    作者:小蚁云安全 链接:https://zhuanlan.zhihu.com/p/493818945 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 对于服务器朋友们 ...

最新文章

  1. 【视频】SQL Server 2008 R2 StreamInsight - 多源复杂事件处理
  2. python方法_Python中的通用__eq __()方法
  3. 最有效的萨克斯弱音器_1990到2016年全球自杀数据公布,中国自杀死亡率下降最显著!...
  4. 录制电脑屏幕的软件_电脑屏幕录制操作方法,太实用了!
  5. 零基础学python-5.6 数字位操作与其它工具
  6. 比Postman更好用!在国产接口调试工具Apipost中使用Mock
  7. java client和servers_“java -server”和“java -client”之间的真正区别?
  8. Javascript中eval函数的用法
  9. PLC编程全科班+人机界面编程+电机+变频器通信培训
  10. STM32L系列与普通STM32F系列的比较
  11. depends.exe 使用说明
  12. DHCP/Netbios
  13. XP的故障恢复控制台
  14. Java分布式锁那点事
  15. 九龙证券“风光储锂芯”集体回暖 创业板指探低回升
  16. java毕业设计芮城县十全十美火锅店点餐系统源码+lw文档+mybatis+系统+mysql数据库+调试
  17. JAVA实现雪花飘落动画效果
  18. 一位程序员的辞职交接工作曝光,同行的人看完若有所思……
  19. linux jdk卸载
  20. MATLAB安装失败,MATLAB软件总是运行特别慢原因分析

热门文章

  1. 黑鲨Android系统耗电高,已达安卓顶配,黑鲨2pro作为主力机,聊聊使用感受
  2. percentile_approx函数用法
  3. 毕业论文查重时泄露怎么办?
  4. :实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包
  5. 传奇手游战神引擎开服教程架设教程工具全套图文教程
  6. 搞懂redux一篇就够了
  7. 批量取消bilibili关注
  8. QtDesigner视频手把手教程制作一个弹性,自适应大小的页面布局
  9. js自动缩放页面自适应屏幕分辨率
  10. css3 描两个边,CSS3 / 指定四条边中图像的显示方法 - 汇智网