前言
项目结构拆分后定时任务所在的模块无法调用别的模块的Bean ,又不允许将定时任务写在业务模块里面,于是采用反射的机制执行调用。
一、参数格式json字符串
{
"clazz": "org.jxxxx.xxxx.xxx",
"methodName": "xxx",//方法名称
"param": "xxxx,123",//参数个数以字符 , 隔开
"argsClass": "java.lang.String,java.lang.Integer",//参数的类型,于param个数对应 , 分割
"info": "xxxx" //日志打印
}
二、具体实现
@Slf4j
public class CommonJob implements Job {
/**
* 参数格式 json字符串
* clazz、methodName、info必须存在
*{
* "clazz": "xx.xx.xxx.xx.xxxClass",
* "methodName": "methodName",//方法名称
* "param": "xxxx,123",//参数个数以字符 ‘ , ’ 隔开
* "argsClass": "java.lang.String,java.lang.Integer",//参数的类型,于param个数对应 , 分割
* "info": "定时任务" //日志打印
*}
*/
private String parameter;
public void setParameter(String parameter) {
this.parameter = parameter;
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
long startTime = System.currentTimeMillis();
JSONObject jsonObject = JSONObject.parseObject(parameter);
log.info("=========="+jsonObject.getString("info")+"开始==========");
Class<?> clazz = Class.forName(jsonObject.get("clazz").toString());
Object bean = SpringContextUtils.getBean(clazz);//SpringContextUtils 封装了的
String argsClass = jsonObject.getString("argsClass");
if(oConvertUtils.isNotEmpty(argsClass)){
String[] args = argsClass.split(",");
Class[] argsClassArr = new Class[args.length];
for (int i = 0, j = args.length; i < j; i++) {
argsClassArr[i] = Class.forName(args[i]);
}
Method method = clazz.getMethod(jsonObject.getString("methodName"),argsClassArr);
String param = jsonObject.getString("param");
Object[] paramValueArr = param.split(",");
Object[] targetValueArr = new Object[paramValueArr.length];
//类型转换
for (int i = 0; i < argsClassArr.length; i++) {
DataBinder dataBinder = new DataBinder(paramValueArr[i]);
Object targetValue = dataBinder.convertIfNecessary(paramValueArr[i], argsClassArr[i]);
targetValueArr[i]=targetValue;
}
method.invoke(bean,targetValueArr);
}else{
Method method = clazz.getMethod(jsonObject.getString("methodName"));
method.invoke(bean);
}
long endTime = System.currentTimeMillis();
log.info("=========="+jsonObject.get("info").toString()+"结束,总耗时"+(endTime-startTime)+"ms 。==========");
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
}