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