1.场景描述
     2.处理方案
     3.相关代码
     4.注意事项说明

1.场景描述

现有一个会员过期处理需求,需要定时进行处理,一般情况下业务都会处理成功.但是在代码逻辑正确的情况下,基于业务的复杂可能会由于数据问题导致定时处理失败,出现问题需要第一时间通知相关人员进行定位,处理问题并及时止损!

2.处理方案

基于出现异常并实时通知,现在能想到的处理方案就是对整个定时处理业务进行try catch处理,一旦捕获住异常,需要进行通知操作,通知的方式有短信通知、邮件、微信消息通知等等,此处仅做短信通知实现(这里使用阿里云的短信服务)。

3.相关代码

定时任务处理

   @Scheduled(cron = "0 5 0 * * *")  // 每天凌晨5分处理public void expireHandle(){// 会员卡过期处理handleStaffCardExpire();}

定时任务处理定时业务逻辑处理

private void handleStaffCardExpire() {try {// 具体业务代码此处忽略具体实现}} catch (Exception ex) {log.error("业务代码处理异常信息:{}",ex.getMessage());// 发送短信操作:多个地方会存在发送短信的需求,所以在这里进行封装一下sendMsgNotice("业务代码处理异常信息");}}

定时任务处理短信发送处理逻辑

private void sendMsgNotice(String msg) {// 获取异常通知短信(此处对短信发送手机号做数据库持久化存储并动态获取)String exceptionMobile = courseRecordMapper.findExceptionMobile();// 发送短信通知try {SendSmsResponse sendSmsResponse = smsServiceImp.sendSms(exceptionMobile, msg, 2);if(!"OK".equals(sendSmsResponse.getBody().getCode())){throw new BussinessExcption(sendSmsResponse.getBody().getMessage());}} catch (Exception e) {log.error("短信发送异常:{}",e.getMessage());}}

定时任务处理截止到这里整个定时任务异常通知的流程已经结束.下面是关于阿里云短信配置遇到的问题的说明,不使用短信通知方式的小伙伴以下内容可以忽略了.
     定时任务处理关于短信发送配置说明:本项目使用阿里云短信服务,实际项目中不同的业务需求对应的短信配置信息以及短信内容是不同的,比如说注册登录的短信模板code是验证码数字,本场景中定时处理异常处理短信模板code需要提示具体的业务异常信息,所以对于不同的业务对应的阿里云短信模板配置以及变量属性和短信内容都会不同.这里对之前仅支持注册短信发送逻辑做了统一改造,可以适配多种不同的短信通知需求.
阿里云短信发送的具体逻辑(部分参数使用配置文件存储,此处不展示配置文件内容):

public SendSmsResponse sendSms(String mobile,String messageContent,int type) throws Exception {Config config = new Config()// AccessKey ID.setAccessKeyId(manageConfig.getAccessKeyID())// AccessKey Secret.setAccessKeySecret(manageConfig.getAccessKeySecret());// 访问的域名config.endpoint = manageConfig.getSmsEndPoint();com.aliyun.dysmsapi20170525.Client client = new com.aliyun.dysmsapi20170525.Client(config);// 组装配置并发送SendSmsRequest sendSmsRequest = new SendSmsRequest();sendSmsRequest.setPhoneNumbers(mobile);sendSmsRequest.setSignName(manageConfig.getSignName());// modify by txm 2021/11/21 短信模板信息实现动态配置MessageEnum messageEnum = MessageEnum.getMessageEnumByTpe(type);sendSmsRequest.setTemplateCode(messageEnum.getTemCode());sendSmsRequest.setTemplateParam("{\""+messageEnum.getVariableAttribute()+"\":\""+messageContent+"\"}");SendSmsResponse sendSmsResponse = client.sendSms(sendSmsRequest);return sendSmsResponse;}

这里使用枚举根据不同的业务类型进行获取不同的短信配置参数

public enum MessageEnum {// 登录以及业务处理异常时短信配置信息LOGIN_MSG(1, "短信模板信息","变量属性"),BUSINESS_MSG(2,"短信模板信息","变量属性");private int type;private String temCode;private String variableAttribute;MessageEnum(int type, String temCode, String variableAttribute) {this.type = type;this.temCode = temCode;this.variableAttribute = variableAttribute;}// 根据对应业务类型获取对应的短信配置信息public static MessageEnum getMessageEnumByTpe(int type){for (MessageEnum messageEnum : MessageEnum.values()) {if(messageEnum.getType() == type){return messageEnum;}}return null;}// 省略get/set.....
}

阿里云的短信模板以及变量属性所在位置

4.注意事项说明

1.如果同一个定时任务中有多个不同的业务处理,建议进行分开捕获处理,好处是对不同的任务处理分支能保证都能进行处理,不会因为一个业务分支出现异常,下面的业务分支不能正常进行.另外即便单个分支出现异常都能单独进行通知.短信通知内容更加精准.
    2.阿里云短信参数组装中的变量属性组装会有坑,常见的错误是json参数不合法.上面拼接的格式适用于验证码这类的数字以及字符串内容.
    3.本项目中对于不同业务只进行了多模板配置申请,使用的是同一签名,现有业务除了注册都是内部人员接收所以这里偷懒了,如果都是面向用户的不同短信通知,建议申请不同的短信签名.对了,这里的短信签名就是对应经常收到短信最前面的发送方名称,比如阿里云短信中最开头的内容是[阿里云].

springboot定时任务中异常处理方案相关推荐

  1. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

  2. springboot项目中favicon.ico的异常处理

    我在第一个springboot项目中没有设置项目名和拦截器以及spring.resources.static-locations,一切都是默认的配置,然后我将favicon.ico放在static目录 ...

  3. SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)

    最为常用定时任务框架是Quartz,并且Spring也集成了Quartz的框架,Quartz不仅支持单实例方式还支持分布式方式.本文主要介绍Quartz,基础的Quartz的集成案例本,以及实现基于数 ...

  4. 寿险业务系统异常处理方案

    我们的系统使用的java语言开发,基于Spring框架搭建的业务中台,在讨论业务系统异常处理策略之前,先把java的异常机制进行简单说明. 一.Java的异常机制 1.Java异常分类 [Error] ...

  5. SpringBoot集成全局异常处理

    2019独角兽企业重金招聘Python工程师标准>>> SpringBoot集成全局异常处理 前言 对于通常的MVC项目,大量的异常需要我们去处理,如此一来,我们的 Controll ...

  6. SpringBoot的全局异常处理的优雅吃法!要进来学习下吗

    SpringBoot的全局异常处理的优雅吃法!要进来学习下吗 SpringBoot全局异常准备 开发准备 环境要求 JDK :1.8 SpringBoot :1.5.17.RELEASE 首先还是Ma ...

  7. 探寻用户自定义定时任务的实践方案

    导读 工作中会遇到一些由用户自定义定时任务的业务场景,常用的开源框架(如 XXL-Job.Quartz)设计的初衷是给开发人员使用,并不适合开放给用户创建大量的自定义任务.本文借鉴开源框架定时任务作业 ...

  8. Springboot应用中线程池配置教程(2021版)

    前言:日常开发中我们常用ThreadPoolExecutor提供的线程池服务帮我们管理线程,在Springboot中更是提供了@Async注解来简化业务逻辑提交到线程池中执行的过程.由于Springb ...

  9. 警惕Python编程中异常处理结构可能的坑

    推荐一本用于修炼Python编程内功的好书<Python程序设计开发宝典>(本文封面图片),扫码了解详情(京东链接): ============================== 所谓异 ...

最新文章

  1. 使用工厂模式与泛型对三层架构的每一层进行解耦
  2. postgresql数据库用户名密码验证失败
  3. Effective C++ 条款21
  4. LintCode 1753. 写作业(二分查找)
  5. 20 CO配置-控制-产品成本控制-产品成本计划编制-定义成本核算变式
  6. tensorflow代码中的tf.app.run()
  7. 最近在练习爬虫,分享一些简单入门的知识
  8. DT时代释放金融数据价值,驱动金融商业裂变
  9. python有道字典_Python基于有道实现英汉字典功能
  10. SAP 录屏BDC使用—实例
  11. C#:Md5和Sha1两种加密方式
  12. Java input char_java.util.regex.Pattern.matcher(CharSequence input)方法
  13. 医院耗材管理系统开发_14
  14. 第5章 软件质量标准概述
  15. 极域电子教室师生端连接不上怎么解决
  16. paperwhite3翻页_Kindle vs. Paperwhite vs. Voyage vs. Oasis:您应该购买哪种Kindle?
  17. 数据分析--Python连接阿里云数据库
  18. 【有利可图网】PS实战系列:用ps做出雨中油画的质感
  19. 雅思阅读考点词-同义替换
  20. Proxy SwitchyOmega安装和使用

热门文章

  1. 综述类slam论文A Survey of Simultaneous Localization and Mapping(一)——激光雷达部分
  2. vue-pure-admin项目的学习
  3. html 放大镜效果
  4. 月薪3万 的一道面试题
  5. docker出现ip冲突现象
  6. 前端跳槽面试总结之业务能力、团队协作能力、职业竞争力和职业规划
  7. datagridview取消默认选中_Winform DataGridView 取消默认选中行
  8. 新生基本信息管理系统java_Java课程设计 学生基本信息管理系统 团队博客
  9. 使用阿里 EasyExcel 读写 Excel 文件
  10. phpstudy 丢失php5ts_phpstudy添加PHP