1
0

JobInvokeUtil.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package com.simuwang.schedule.util;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import com.simuwang.base.common.util.StringUtil;
  4. import com.simuwang.schedule.domain.SysJob;
  5. import org.apache.commons.lang3.StringUtils;
  6. import java.lang.reflect.InvocationTargetException;
  7. import java.lang.reflect.Method;
  8. import java.util.LinkedList;
  9. import java.util.List;
  10. /**
  11. * 任务执行工具
  12. *
  13. * @author ruoyi
  14. */
  15. public class JobInvokeUtil
  16. {
  17. /**
  18. * 执行方法
  19. *
  20. * @param sysJob 系统任务
  21. */
  22. public static void invokeMethod(SysJob sysJob) throws Exception
  23. {
  24. String invokeTarget = sysJob.getInvokeTarget();
  25. String beanName = getBeanName(invokeTarget);
  26. String methodName = getMethodName(invokeTarget);
  27. List<Object[]> methodParams = getMethodParams(invokeTarget);
  28. if (!isValidClassName(beanName))
  29. {
  30. Object bean = SpringUtil.getBean(beanName);
  31. invokeMethod(bean, methodName, methodParams);
  32. }
  33. else
  34. {
  35. Object bean = Class.forName(beanName).getDeclaredConstructor().newInstance();
  36. invokeMethod(bean, methodName, methodParams);
  37. }
  38. }
  39. /**
  40. * 调用任务方法
  41. *
  42. * @param bean 目标对象
  43. * @param methodName 方法名称
  44. * @param methodParams 方法参数
  45. */
  46. private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
  47. throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
  48. InvocationTargetException
  49. {
  50. if (StringUtil.isNotNull(methodParams) && methodParams.size() > 0)
  51. {
  52. Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
  53. method.invoke(bean, getMethodParamsValue(methodParams));
  54. }
  55. else
  56. {
  57. Method method = bean.getClass().getMethod(methodName);
  58. method.invoke(bean);
  59. }
  60. }
  61. /**
  62. * 校验是否为为class包名
  63. *
  64. * @param invokeTarget 名称
  65. * @return true是 false否
  66. */
  67. public static boolean isValidClassName(String invokeTarget)
  68. {
  69. return StringUtils.countMatches(invokeTarget, ".") > 1;
  70. }
  71. /**
  72. * 获取bean名称
  73. *
  74. * @param invokeTarget 目标字符串
  75. * @return bean名称
  76. */
  77. public static String getBeanName(String invokeTarget)
  78. {
  79. String beanName = StringUtils.substringBefore(invokeTarget, "(");
  80. return StringUtils.substringBeforeLast(beanName, ".");
  81. }
  82. /**
  83. * 获取bean方法
  84. *
  85. * @param invokeTarget 目标字符串
  86. * @return method方法
  87. */
  88. public static String getMethodName(String invokeTarget)
  89. {
  90. String methodName = StringUtils.substringBefore(invokeTarget, "(");
  91. return StringUtils.substringAfterLast(methodName, ".");
  92. }
  93. /**
  94. * 获取method方法参数相关列表
  95. *
  96. * @param invokeTarget 目标字符串
  97. * @return method方法相关参数列表
  98. */
  99. public static List<Object[]> getMethodParams(String invokeTarget)
  100. {
  101. String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
  102. if (StringUtils.isEmpty(methodStr))
  103. {
  104. return null;
  105. }
  106. String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
  107. List<Object[]> classs = new LinkedList<>();
  108. for (int i = 0; i < methodParams.length; i++)
  109. {
  110. String str = StringUtils.trimToEmpty(methodParams[i]);
  111. // String字符串类型,以'或"开头
  112. if (StringUtils.startsWithAny(str, "'", "\""))
  113. {
  114. classs.add(new Object[] { StringUtils.substring(str, 1, str.length() - 1), String.class });
  115. }
  116. // boolean布尔类型,等于true或者false
  117. else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str))
  118. {
  119. classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
  120. }
  121. // long长整形,以L结尾
  122. else if (StringUtils.endsWith(str, "L"))
  123. {
  124. classs.add(new Object[] { Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class });
  125. }
  126. // double浮点类型,以D结尾
  127. else if (StringUtils.endsWith(str, "D"))
  128. {
  129. classs.add(new Object[] { Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class });
  130. }
  131. // 其他类型归类为整形
  132. else
  133. {
  134. classs.add(new Object[] { Integer.valueOf(str), Integer.class });
  135. }
  136. }
  137. return classs;
  138. }
  139. /**
  140. * 获取参数类型
  141. *
  142. * @param methodParams 参数相关列表
  143. * @return 参数类型列表
  144. */
  145. public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
  146. {
  147. Class<?>[] classs = new Class<?>[methodParams.size()];
  148. int index = 0;
  149. for (Object[] os : methodParams)
  150. {
  151. classs[index] = (Class<?>) os[1];
  152. index++;
  153. }
  154. return classs;
  155. }
  156. /**
  157. * 获取参数值
  158. *
  159. * @param methodParams 参数相关列表
  160. * @return 参数值列表
  161. */
  162. public static Object[] getMethodParamsValue(List<Object[]> methodParams)
  163. {
  164. Object[] classs = new Object[methodParams.size()];
  165. int index = 0;
  166. for (Object[] os : methodParams)
  167. {
  168. classs[index] = (Object) os[0];
  169. index++;
  170. }
  171. return classs;
  172. }
  173. }