ShiShiYiBan/ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java

160 lines
5.4 KiB
Java
Raw Normal View History

2020-07-19 10:25:40 +08:00
package com.ruoyi.quartz.util;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
2021-02-13 21:13:09 +08:00
2020-07-19 10:25:40 +08:00
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.quartz.domain.SysJob;
/**
* 任务执行工具
*
* @author ruoyi
*/
2021-02-13 21:13:09 +08:00
public class JobInvokeUtil {
2020-07-19 10:25:40 +08:00
/**
* 执行方法
*
* @param sysJob 系统任务
*/
2021-02-13 21:13:09 +08:00
public static void invokeMethod(SysJob sysJob) throws Exception {
2020-07-19 10:25:40 +08:00
String invokeTarget = sysJob.getInvokeTarget();
String beanName = getBeanName(invokeTarget);
String methodName = getMethodName(invokeTarget);
List<Object[]> methodParams = getMethodParams(invokeTarget);
2021-02-13 21:13:09 +08:00
if (!isValidClassName(beanName)) {
2020-07-19 10:25:40 +08:00
Object bean = SpringUtils.getBean(beanName);
invokeMethod(bean, methodName, methodParams);
2021-02-13 21:13:09 +08:00
} else {
2020-07-19 10:25:40 +08:00
Object bean = Class.forName(beanName).newInstance();
invokeMethod(bean, methodName, methodParams);
}
}
/**
* 调用任务方法
*
2021-02-13 21:13:09 +08:00
* @param bean 目标对象
* @param methodName 方法名称
2020-07-19 10:25:40 +08:00
* @param methodParams 方法参数
*/
private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
2021-02-13 21:13:09 +08:00
InvocationTargetException {
if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) {
2020-07-19 10:25:40 +08:00
Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
method.invoke(bean, getMethodParamsValue(methodParams));
2021-02-13 21:13:09 +08:00
} else {
2020-07-19 10:25:40 +08:00
Method method = bean.getClass().getDeclaredMethod(methodName);
method.invoke(bean);
}
}
/**
* 校验是否为为class包名
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param str 名称
* @return true是 false否
*/
2021-02-13 21:13:09 +08:00
public static boolean isValidClassName(String invokeTarget) {
2020-07-19 10:25:40 +08:00
return StringUtils.countMatches(invokeTarget, ".") > 1;
}
/**
* 获取bean名称
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param invokeTarget 目标字符串
* @return bean名称
*/
2021-02-13 21:13:09 +08:00
public static String getBeanName(String invokeTarget) {
2020-07-19 10:25:40 +08:00
String beanName = StringUtils.substringBefore(invokeTarget, "(");
return StringUtils.substringBeforeLast(beanName, ".");
}
/**
* 获取bean方法
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param invokeTarget 目标字符串
* @return method方法
*/
2021-02-13 21:13:09 +08:00
public static String getMethodName(String invokeTarget) {
2020-07-19 10:25:40 +08:00
String methodName = StringUtils.substringBefore(invokeTarget, "(");
return StringUtils.substringAfterLast(methodName, ".");
}
/**
* 获取method方法参数相关列表
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param invokeTarget 目标字符串
* @return method方法相关参数列表
*/
2021-02-13 21:13:09 +08:00
public static List<Object[]> getMethodParams(String invokeTarget) {
2020-07-19 10:25:40 +08:00
String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
2021-02-13 21:13:09 +08:00
if (StringUtils.isEmpty(methodStr)) {
2020-07-19 10:25:40 +08:00
return null;
}
String[] methodParams = methodStr.split(",");
List<Object[]> classs = new LinkedList<>();
2021-02-13 21:13:09 +08:00
for (int i = 0; i < methodParams.length; i++) {
2020-07-19 10:25:40 +08:00
String str = StringUtils.trimToEmpty(methodParams[i]);
// String字符串类型包含'
2021-02-13 21:13:09 +08:00
if (StringUtils.contains(str, "'")) {
classs.add(new Object[]{StringUtils.replace(str, "'", ""), String.class});
2020-07-19 10:25:40 +08:00
}
// boolean布尔类型等于true或者false
2021-02-13 21:13:09 +08:00
else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false")) {
classs.add(new Object[]{Boolean.valueOf(str), Boolean.class});
2020-07-19 10:25:40 +08:00
}
// long长整形包含L
2021-02-13 21:13:09 +08:00
else if (StringUtils.containsIgnoreCase(str, "L")) {
classs.add(new Object[]{Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class});
2020-07-19 10:25:40 +08:00
}
// double浮点类型包含D
2021-02-13 21:13:09 +08:00
else if (StringUtils.containsIgnoreCase(str, "D")) {
classs.add(new Object[]{Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class});
2020-07-19 10:25:40 +08:00
}
// 其他类型归类为整形
2021-02-13 21:13:09 +08:00
else {
classs.add(new Object[]{Integer.valueOf(str), Integer.class});
2020-07-19 10:25:40 +08:00
}
}
return classs;
}
/**
* 获取参数类型
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param methodParams 参数相关列表
* @return 参数类型列表
*/
2021-02-13 21:13:09 +08:00
public static Class<?>[] getMethodParamsType(List<Object[]> methodParams) {
2020-07-19 10:25:40 +08:00
Class<?>[] classs = new Class<?>[methodParams.size()];
int index = 0;
2021-02-13 21:13:09 +08:00
for (Object[] os : methodParams) {
2020-07-19 10:25:40 +08:00
classs[index] = (Class<?>) os[1];
index++;
}
return classs;
}
/**
* 获取参数值
2021-02-13 21:13:09 +08:00
*
2020-07-19 10:25:40 +08:00
* @param methodParams 参数相关列表
* @return 参数值列表
*/
2021-02-13 21:13:09 +08:00
public static Object[] getMethodParamsValue(List<Object[]> methodParams) {
2020-07-19 10:25:40 +08:00
Object[] classs = new Object[methodParams.size()];
int index = 0;
2021-02-13 21:13:09 +08:00
for (Object[] os : methodParams) {
2020-07-19 10:25:40 +08:00
classs[index] = (Object) os[0];
index++;
}
return classs;
}
}