基于Java反射的定时任务设计
一、使用场景
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反射的定时任务设计的更多相关文章
- 基于Java反射的map自动装配JavaBean工具类设计
我们平时在用Myabtis时不是常常需要用map来传递参数,大体是如下的步骤: public List<Role> findRoles(Map<String,Object> p ...
- 基于java反射的javabean和map相互转换的工具类
话不多说,代码如下 package com.study; import java.lang.reflect.Field; import java.util.HashMap; import java.u ...
- 基于Java Mina框架的部标808服务器设计和开发
在开发部标GPS平台中,部标808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言. 我们为客户开发的部标服务器基于Min ...
- 基于Java Mina框架的部标jt808服务器设计和开发
在开发部标GPS平台中,部标jt808GPS服务器是系统的核心关键,决定了部标平台的稳定性和行那个.Linux服务器是首选,为了跨平台,开发语言选择Java自不待言.需要购买jt808GPS服务器源码 ...
- 利用JAVA反射机制设计通用的DAO
利用JAVA反射机制设计一个通用的DAO 反射机制 反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息. 反射机制创建类对象 ...
- 基于NACOS和JAVA反射机制动态更新JAVA静态常量非@Value注解
1.前言 项目中都会使用常量类文件, 这些值如果需要变动需要重新提交代码,或者基于@Value注解实现动态刷新, 如果常量太多也是很麻烦; 那么 能不能有更加简便的实现方式呢? 本文讲述的方式是, 一 ...
- 读懂框架设计的灵魂—Java反射机制
尽人事,听天命.博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步 本文已收录于 CS-Wiki(Gitee 官 ...
- 课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统
课程设计- 基于ssm的捐赠物资分配管理系统 && 基于java的申请救援管理系统 注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架: ...
- Java反射机制的学习
Java反射机制是Java语言被视为准动态语言的关键性质.Java反射机制的核心就是允许在运行时通过Java Reflection APIs来取得已知名字的class类的相关信息,动态地生成此类,并调 ...
随机推荐
- 牛客网PAT练习场-有几个PAT
题目地址:https://www.nowcoder.com/pat/6/problem/4066 题意:求pat->求pa->求p /** * *作者:YCute *时间:2019-12- ...
- 工作不到一年,做出了100k系统,老板给我升职加薪
看了下自己上一次发技术文还是在6月15日,算了算也是两个来月了.别怕,短暂的离开,是为了更好的相遇. 来到新公司以后啊,发现公司的搜索业务是真的太多了,大大小小有几百个搜索业务.来了之后得先梳理.熟悉 ...
- 由浅入深理解 IOC 和 DI
目录 由浅入深理解 IOC 和 DI 开闭原则 OCP(Open Closed Principle) 面向抽象编程 逐步理解实现 IOC 和 DI 的过程(LOL Demo 示例) 比较尴尬的编写程序 ...
- Android开发之TextView中间设置横线,适用于电商项目,商品原价之类的功能。
textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG ); //中间横线 textview.getPaint().setFlags(Pai ...
- 程序员软件开发最好的IDE集成工具eclipse各个版本的详细介绍。详细介绍,送给初学者的朋友
对于刚接触软件开发的初学者,在下载eclipse时,对官网上面提供的各种版本的选择犹豫不决.下面将对常用的几个版本进行介绍. Eclipse版本 Eclipse Standard 该版本是eclips ...
- 用rspec执行自动化测试用例
rspec是一款行为驱动开发(BDD)的工具,不过在这里用于测试,准确来说应该是测试驱动开发(TDD)吧.事实上我也没搞清楚.作为初学者不清楚就不清楚吧,以后会知道的.写博客无非就是写写学习笔记,不纠 ...
- Unity资源引用问题
前几天做项目时,遇到一个奇怪的问题: 从一处复制了一个预制体,预制体上面还附有一个材质球,材质球上关联着另一张贴图. 将所有关联的东西,均Copy两份,然后关联成一个新的预制体,最后用项目内的读取内存 ...
- Pandas | Dataframe的merge操作,像数据库一样尽情join
今天是pandas数据处理第8篇文章,我们一起来聊聊dataframe的合并. 常见的数据合并操作主要有两种,第一种是我们新生成了新的特征,想要把它和旧的特征合并在一起.第二种是我们新获取了一份数据集 ...
- Content Security Policy (CSP)内容安全策略总结
跨域脚本攻击 XSS 是最常见.危害最大的网页安全漏洞. 为了防止它们,要采取很多编程措施,非常麻烦.很多人提出,能不能根本上解决问题,浏览器自动禁止外部注入恶意脚本?这就是"网页安全政策& ...
- [BUUOJ记录] [ACTF2020 新生赛]Include
本题主要考查了利用php://filter伪协议进行文件包含 进入题目根据Tip进入正题,可以看到URL中存在文件包含(题目名也很直接) 首先考虑 "php://input"伪协议 ...