一、使用场景

1、不需要立即执行、立即得到结果返回。

2、如果执行失败、需要有失败补偿机制。

3、和业务代码解耦,适用于不同的务场景。

4、调用接口的入参、出参 统计,方便查询。

二、执行顺序

1、业务逻辑中,需要调用外部接口时,将参数组装好,往任务表中插入一条任务记录。(主要包括 任务类型、需要执行的类、方法、参数 等)

2、使用定时任务(xxlJob或分布式worker)定时扫描任务表中待执行或执行失败(未超过最大重试次数)的任务。

3、拿到待执行任务后,采用反射思想 执行任务,并记录执行状态和执行结果。

三、代码示例

表设计(通用任务执行表)

主要字段

任务类型 、task_type

执行状态、exec_status(待执行、执行成功、执行失败)

执行的类、exec_class

执行的方法、exec_method

执行方法的参数、exec_param

执行结果、exec_result

重试次数、retry_times

核心代码

定时任务调度

/**
* 执行通用任务
*/
public void doTaskList() {
List<Task> taskList = taskMapper.selectTaskList();
if (CollectionUtils.isEmpty(taskList)) {
return;
}
for (Task task : taskList) {
try {
Integer retryTimes = task.getRetryTimes();
if (retryTimes == 1) {
Date updateTime = task.getGmtModified();
// 第一次重试,执行时间和上次时间间隔至少5分钟
if (updateTime.getTime() + 1000 * 60 * 5 > System.currentTimeMillis()) {
continue;
}
}
if (retryTimes == 2) {
Date updateTime = task.getGmtModified();
// 第二次重试,执行时间和上次时间间隔至少30分钟
if (updateTime.getTime() + 1000 * 60 * 30 > System.currentTimeMillis()) {
continue;
}
}
service.doTaskExec(task);
} catch (Exception e) {
// 执行失败发送提醒邮件
}
}
}

反射执行

/**
* 通用任务执行
*
* @param task 待执行的任务
*/
public void doTaskExec(Task task) throws ClassNotFoundException {
String execClass = task.getExecClass();
String execMethod = task.getExecMethod();
String execParam = task.getExecParam(); Class<?> clazz = Class.forName(execClass);
Object object = ApplicationContextUtil.getBean(clazz);
Method[] methods = clazz.getMethods();
for (Method method : methods) {
if (!method.getName().equals(execMethod)) {
continue;
}
Class<?>[] paramTypes = method.getParameterTypes();
Object[] objectValue = new Object[paramTypes.length];
for (int i = 0; i < paramTypes.length; i++) {
objectValue[i] = JSON.parseObject(execParam, paramTypes[i]);
}
Object execResult;
try {
execResult = reflection(object, clazz, execMethod, paramTypes, objectValue);
} catch (Exception e) {
log.error("外部接口返回异常:", e);
processFailureExecResult(task, e.getMessage());
return;
}
processExecResult(task, JSON.toJSONString(execResult));
}
}

基于Java反射的定时任务设计的更多相关文章

  1. 基于Java反射的map自动装配JavaBean工具类设计

    我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...

  2. 基于java反射的javabean和map相互转换的工具类

    话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...

  3. 基于Java Mina框架的部标808服务器设计和开发

    在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...

  4. 基于Java Mina框架的部标jt808服务器设计和开发

    在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...

  5. 利用JAVA反射机制设计通用的DAO

    利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,    那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...

  6. 基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解

    1.前言 项目中都会使用常量类文件, 这些值如果需要变动需要重新提交代码,或者基于@Value注解实现动态刷新, 如果常量太多也是很麻烦; 那么 能不能有更加简便的实现方式呢? 本文讲述的方式是, 一 ...

  7. 读懂框架设计的灵魂—Java反射机制

    尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...

  8. 课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统

    课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架: ...

  9. Java反射机制的学习

    Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...

随机推荐

  1. promise和async await的区别

    在项目中第一次遇到async await的这种异步写法,来搞懂它 项目场景 :点击登录按钮后执行的事件,先进行表单校验 this.$refs.loginFormRef.validate(element ...

  2. 洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP

    洛谷 P4284 [SHOI2014]概率充电器 概率与期望+换根DP 题目描述 著名的电子产品品牌\(SHOI\) 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米 ...

  3. centos6.8上安装部署 jhipster-registry

    必备环境:jdk8,git,maven 1.安装nodejs #由于采用编译的方式很容易出现一些意外的惊喜,所以我们这儿直接用yum命令安装 #1.查看nodejs版本(命令中不要加 -y 如果版本不 ...

  4. 攻防世界——web新手练习区解题记录<1>(1-4题)

    web新手练习区一至四题 第一题view_source: 题目说右键不管用了,我们先获取在线场景来看一看,我们看到这样一个网页,并且右键确实点了没什么反应,而用到右键一般就是查看网页源码 用快捷键(F ...

  5. OpenShift Container Platform 4.3.0部署实录

    本文参照红帽官方文档,在裸机安装Openshift4.3文档进行.因为只有一台64G内存的PC机,安装vmware vsphere 6.7免费版进行本测试,所以尝试在OCP官方文档要求的最低内存需求基 ...

  6. 目标检测中的IOU和CIOU原理讲解以及应用(附测试代码)

    上期讲解了目标检测中的三种数据增强的方法,这期我们讲讲目标检测中用来评估对象检测算法的IOU和CIOU的原理应用以及代码实现. 交并比IOU(Intersection over union) 在目标检 ...

  7. Python之 最全 Conda、pip 管理环境和安装包、更换源、解决HttpError等一些列问题

    在Anaconda中conda可以理解为一个工具,也是一个可执行命令,其核心功能是环境管理与包管理.所以对虚拟环境进行创建.删除等操作需要使用conda命令. conda install 和 pip ...

  8. Vue文件模板

    <template> <div> </div> </template> <script> export default { } </s ...

  9. pwnable.kr之passcode

    使用ssh passcode@pwnable.kr -p2222登录到远程服务器, ls -l 查看目录下的文件, -r--r----- root passcode_pwn Jun flag -r-x ...

  10. JavaScript函数及面向对象

    函数及面向对象 目录 函数及面向对象 1. 定义函数 1. 定义方式一 2. 定义方式二 2. 调用函数 1. 参数问题 2. arguments 3. rest 3. 变量的作用域 1 . var的 ...