背景:我们需要做一个分布式定时任务,定时给用户发短信,设计思路是用@SchedulerLock做分布式定时任务,任务是从每次从数据库查询1000条用户数据,并异步发送短信,发送完成后在数据库里记录发送信息,@Schedule配置为@Scheduled(cron = “0/5 0/1 10-17 * * ?”),@SchedulerLock配置为 @SchedulerLock(name = SCHEDULE_MODEL_NAME + “ticketRemind”, lockAtLeastFor = “PT5S”, lockAtMostFor = “PT10S”)

问题:我们发现有用户收到两条相同的短信,且间隔时间1s

排查思路:先查看数据库,发现确实有对相同用户发送两条短信的记录,且间隔时间为1s,并且同一批1000个用户,每个用户都发送了两次,随后查询系统日志,发现任务确实如@Scheduled配置每5s执行一次,如果获取不到分布式锁,就在下一个5s执行,查询问题前后的日志,发现在11:03:25的定时任务在11:03:37才处理完,同时在11:03:35又开始了新的定时任务,因此可以推断出,由于我们的lockAtMostFor设置只有10s,因此当任务处理时间超过10s时,该任务处理节点就会放弃分布式锁,其他节点可以获得该分布式锁,由于前一个任务还没有处理完成,数据库里还没有任务完成的记录,因此会导致下一个节点执行相同的任务。

解决办法
1.保证任务不可重复执行
由于我们的业务需要在任务确实处理完成后,才能记录完成信息,不能保证不可重复执行,因此需要想其他办法
2.增大lockAtMostFor 时间
无法百分之百地保证任务不会重复执行,但是能大大降低任务重复执行的概率

思考:如果不设置lockAtMostFor ,知道任务处理完成才释放锁,那么当该节点出现问题时,锁可能就会一直锁住,无法让出锁给其他节点处理,显然不合适,而设置了就可能会出现任务重复执行的问题,不知道@SchedulerLock能不能在超时的时候回滚任务或者跳过该任务

@ScedulerLock踩坑相关推荐

  1. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  2. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  3. python导入类有红线_python踩坑系列之导入包时下划红线及报错“No module named”问题...

    python踩坑系列之导入包时下划红线及报错"No module named"问题 使用pycharm编写Python时,自己写了一个包(commontool),在同级另一个路径下 ...

  4. mysql运维工资_MySQL运维踩坑

    image ZERO 背景 本文主要是介绍在MySQL使用运维过程中所遇到的一些坑爹的地方,予自己以做记录! 前言 因操作系统重装之后,安装了mysql5.7,而由此带来了一系列的问题,现将解决这些m ...

  5. 微信跳一跳高分辅助踩坑

    旧博文,搬到 csdn 原文:http://rebootcat.com/2018/01/08/wechat_jump_hack/ 最近挺火的微信跳一跳 最近新版微信的『跳一跳』小程序着实火了一把,也把 ...

  6. 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

  7. 分布式深度学习最佳入门(踩坑)指南

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者丨Lyon@知乎(已授权) 来源丨https://zhuanla ...

  8. python array赋值_从踩坑学Python内部原理(5):执行时机的差异

    (给Python开发者加星标,提升Python技能) 英文:Satwik Kansal,翻译:暮晨 Python开发者整理自 GitHub [导读]:Python 是一个设计优美的解释型高级语言,它提 ...

  9. 小程序统一服务消息_[miniblog]小程序订阅消息踩坑记

    有阵子没有更新我的mini-blog了,这次把推送消息那块做了些改动,小程序的模板消息即将废弃,订阅消息终于来了. 关于订阅消息 订阅消息分为一次性订阅和长期订阅,长期订阅就不说啦,不是个人号可以染指 ...

最新文章

  1. webapi添加html页面,如何从WebApi动作返回html页面?
  2. BZOJ 1488 Luogu P4727 [HNOI2009]图的同构 (Burnside引理、组合计数)
  3. (十三) 深入浅出TCPIP之TCP套接字参数
  4. 将html表格导出到excel表格,table2excel-将HTML表格内容导出到Excel中_html/css_WEB-ITnose...
  5. 高质量代码才能最快投入生产
  6. 【LeetCode】【HOT】20. 有效的括号(栈)
  7. rust腐蚀深井_深井开采中的地压现象致因分析及措施_高光
  8. 基于JAVA+SpringBoot+Mybatis+MYSQL的医院管理系统
  9. 判断二叉树是否对称的代码
  10. hiho 第118周 网络流四·最小路径覆盖
  11. function小记
  12. Window10屏幕亮度无法调节尝试解决方法
  13. 2021绍兴市大学生程序设计竞赛邀请赛题解
  14. SPP、RFB和ASPP
  15. springboot基于web的摩托车销售系统的设计与实现毕业设计源码031706
  16. 不是美术生学3D建模多久能上手?靠自学很难学成功吗?
  17. maven相关(1)
  18. 列存储相关概念和常见列式存储数据库(Hbase、德鲁依)
  19. 微信公众号-消息推送
  20. Win10系统搜不到airpods?

热门文章

  1. 经典打怪兽小游戏分析
  2. 七个经典实用的绩效考核工具(zt)
  3. 日韩潮流千鸟格流苏披肩
  4. KAAS(KEGG Automatic Annotation Server):一个非常好用的在线注释工具
  5. C语言单相智能电表课程设计,51单片机电子跑表课程设计报告 含源代码,原理图,word文档...
  6. 3.Python教程--项目框架篇(全)
  7. 考研数学 每日一题 第十一天
  8. Charles--breakpoint
  9. setfont java_Font是字体类,可以实例化一个字体对象,图形对象通过setFont( )可以设置相应的字体。...
  10. Mac OS下安装mysql及其简单使用