ESBCamelService.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. package com.yihu.hos.services;
  2. import com.yihu.hos.common.classLoader.DynamicClassLoader;
  3. import com.yihu.hos.common.compiler.CamelCompiler;
  4. import com.yihu.hos.common.constants.BrokerConstant;
  5. import com.yihu.hos.core.constants.CoreConstant;
  6. import com.yihu.hos.core.datatype.ClassFileUtil;
  7. import com.yihu.hos.core.datatype.StringUtil;
  8. import com.yihu.hos.models.SystemCamelContext;
  9. import com.yihu.hos.models.SystemClassMapping;
  10. import com.yihu.hos.web.framework.model.Result;
  11. import org.apache.camel.builder.RouteBuilder;
  12. import org.apache.log4j.LogManager;
  13. import org.apache.log4j.Logger;
  14. import org.springframework.stereotype.Service;
  15. import java.io.File;
  16. import java.io.IOException;
  17. import java.net.MalformedURLException;
  18. import java.util.Map;
  19. /**
  20. * Created by lingfeng on 2016/8/4.
  21. */
  22. @Service("ESBCamelService")
  23. public class ESBCamelService {
  24. public static final String BEAN_ID = "ESBCamelService";
  25. private static Logger logger = LogManager.getLogger(ESBCamelService.class);
  26. /**
  27. * 当外界组件通知一个新的processor处理器被定义时,该事件被触发。
  28. * @param serviceFlow 本次processor处理器变化,所涉及的业务系统唯一标识。
  29. * @param packageName processor处理器定义涉及的class包名
  30. * @param className processor处理器定义涉及的class类名
  31. * @param path processor处理器定义涉及的class对应路径
  32. */
  33. public Result onProcessorAdded(String serviceFlow, String packageName, String className, String path) {
  34. try {
  35. if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
  36. || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
  37. logger.error("必要的入参数据不正确,请检查!");
  38. return Result.error("必要的入参数据不正确,请检查!");
  39. }
  40. this.createClassfile(serviceFlow, packageName, className, path, BrokerConstant.PROCESSOR);
  41. return Result.success("新增处理器成功!");
  42. } catch (Exception e) {
  43. logger.error(e);
  44. return Result.error("新增处理器失败!");
  45. }
  46. }
  47. /**
  48. * 当外界组件通知一个已有的processor处理器data部分发生变化时,该事件被触发。
  49. */
  50. public Result onProcessorDataChanged(String serviceFlow , String packageName , String className , String path) {
  51. try {
  52. if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
  53. || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
  54. logger.error("必要的入参数据不正确,请检查!");
  55. return Result.error("必要的入参数据不正确,请检查!");
  56. }
  57. this.updateClassfile(serviceFlow, packageName, className, path, BrokerConstant.PROCESSOR);
  58. SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
  59. SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
  60. DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
  61. Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE));
  62. classLoader.loadClass(ClassLoader.getSystemResource(CoreConstant.EMPTY).getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.PROCESSOR));
  63. if (routeBuilderClass != null) {
  64. RouteBuilder routeBuilder = routeBuilderClass.newInstance();
  65. SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
  66. }
  67. return Result.success("修改处理器成功!");
  68. } catch (Exception e) {
  69. logger.error(e);
  70. return Result.error("修改路由失败!");
  71. }
  72. }
  73. /**
  74. * 当外界组件通知一个新的RouteDefine路由被定义时,该事件被触发
  75. */
  76. public Result onRouteDefineAdded(String serviceFlow , String packageName , String className , String path) {
  77. try {
  78. if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
  79. || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
  80. logger.error("必要的入参数据不正确,请检查!");
  81. return Result.error("必要的入参数据不正确,请检查!");
  82. }
  83. // 第1、2两步处理过程,都是在这里完成
  84. this.createClassfile(serviceFlow, packageName, className, path, BrokerConstant.ROUTE);
  85. // 3、===============加载到CamelContext中
  86. ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
  87. Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) currentClassLoader.loadClass(SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE));
  88. if(routeBuilderClass != null) {
  89. RouteBuilder routeBuilder = routeBuilderClass.newInstance();
  90. SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
  91. }
  92. return Result.success("新增路由成功!");
  93. } catch (Exception e) {
  94. logger.error(e);
  95. return Result.error("新增路由失败!");
  96. }
  97. }
  98. /**
  99. * 当外界组件通知一个已有的RouteDefine路由定义被改变时,主要就是路由定义内容被改变时,该事件被触发。
  100. */
  101. public Result onRouteDefineChanged(String serviceFlow, String packageName, String className, String path) {
  102. try {
  103. if (StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
  104. || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
  105. logger.error("必要的入参数据不正确,请检查!");
  106. return Result.error("必要的入参数据不正确,请检查!");
  107. }
  108. SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
  109. SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
  110. this.updateClassfile(serviceFlow, packageName, className, path, BrokerConstant.ROUTE);
  111. // 3、===============加载到CamelContext中
  112. DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
  113. Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(ClassLoader.getSystemResource(CoreConstant.EMPTY).getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE));
  114. if (routeBuilderClass != null) {
  115. RouteBuilder routeBuilder = routeBuilderClass.newInstance();
  116. SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
  117. }
  118. return Result.success("修改路由成功!");
  119. } catch (Exception e) {
  120. return Result.error("修改路由失败!");
  121. }
  122. }
  123. /**
  124. * 当外界组件通知一个已有的RouteDefine路由定义被删除时,该事件被触发。
  125. */
  126. public Result onRouteDefineDelete(String serviceFlow, String packageName, String className) {
  127. try {
  128. if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
  129. || StringUtil.isEmpty(className)) {
  130. logger.error("必要的入参数据不正确,请检查!");
  131. return Result.error("必要的入参数据不正确,请检查!");
  132. }
  133. SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
  134. SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
  135. this.deleteClassfile(serviceFlow, packageName, className, BrokerConstant.PROCESSOR);
  136. return Result.success("删除路由成功!");
  137. } catch (Exception e) {
  138. return Result.error("删除路由失败!");
  139. }
  140. }
  141. /**
  142. * 启动路由时,该事件被触发。
  143. */
  144. public Result onRouteDefineStart(String serviceFlow) {
  145. try {
  146. if(StringUtil.isEmpty(serviceFlow)) {
  147. logger.error("必要的入参数据不正确,请检查!");
  148. return Result.error("必要的入参数据不正确,请检查!");
  149. }
  150. SystemCamelContext.getDefaultCamelContext().startRoute(serviceFlow);
  151. return Result.success("启动路由成功!");
  152. } catch (Exception e) {
  153. return Result.error("启动路由失败!");
  154. }
  155. }
  156. /**
  157. * 停止路由时,该事件被触发。
  158. */
  159. public Result onRouteDefineStop(String serviceFlow) {
  160. try {
  161. if(StringUtil.isEmpty(serviceFlow)) {
  162. logger.error("必要的入参数据不正确,请检查!");
  163. return Result.error("必要的入参数据不正确,请检查!");
  164. }
  165. SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
  166. return Result.success("停止路由成功!");
  167. } catch (Exception e) {
  168. return Result.error("停止路由失败!");
  169. }
  170. }
  171. private void createClassfile(String serviceFlow, String packageName, String className, String path, String type) throws MalformedURLException {
  172. // 1、============
  173. File systemClassFlowPath = new File(this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath());
  174. // 记录到工具类中,以便其它线程需要时进行取用
  175. SystemClassMapping.getSystemClassNameMapping().put(serviceFlow + type, packageName + CoreConstant.DOT + className);
  176. // 2、============开始写入class文件
  177. ClassFileUtil.createClassfile(systemClassFlowPath.toURI().toURL(), packageName, className, path);
  178. // 完成
  179. logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 生成过程结束");
  180. }
  181. private void updateClassfile(String serviceFlow, String packageName, String className, String path, String type) {
  182. // 1、============
  183. Map<String, String> systemClassNameMapping = SystemClassMapping.getSystemClassNameMapping();
  184. String systemClassName = systemClassNameMapping.get(serviceFlow + type);
  185. if(StringUtil.isEmpty(systemClassName)) {
  186. return;
  187. }
  188. String packagePath = StringUtil.replaceStrAll(packageName, ".", "/");
  189. String classPath = this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath() + packagePath + "/" + className + ".class";
  190. // 2、============开始写入class文件
  191. ClassFileUtil.updateClassfile(classPath, path);
  192. // 完成
  193. logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 修改过程结束");
  194. }
  195. private void deleteClassfile(String serviceFlow, String packageName, String className, String type) {
  196. // 1、============
  197. Map<String, String> systemClassNameMapping = SystemClassMapping.getSystemClassNameMapping();
  198. String systemClassName = systemClassNameMapping.get(serviceFlow + type);
  199. if(StringUtil.isEmpty(systemClassName)) {
  200. return;
  201. }
  202. String packagePath = StringUtil.replaceStrAll(packageName, ".", "/");
  203. String classPath = ClassLoader.getSystemResource("").getPath() + "/" + packagePath + "/" + className + ".class";
  204. // 2、============开始写入class文件
  205. ClassFileUtil.deleteClassfile(classPath);
  206. // 完成
  207. logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 删除过程结束");
  208. }
  209. /* ************************** 修改任务cron生成新的camel文件 add by hzy *********************************** */
  210. public Result genNewClassfile(String type,String filePath, String packageName, String oldClassName, String newClassName,String newCron) {
  211. try {
  212. String path;
  213. if ("route".equals(type)){
  214. path = CamelCompiler.compiler(filePath,packageName,oldClassName,newClassName,newCron);
  215. }else if ("processor".equals(type)){
  216. path = CamelCompiler.copyProcess(filePath,packageName,oldClassName);
  217. }else {
  218. return Result.error("传入类别参数有误!");
  219. }
  220. return Result.success(path);
  221. } catch (IOException e) {
  222. e.printStackTrace();
  223. return Result.error("生成新文件失败!");
  224. }
  225. }
  226. public Result copyProcessor(String filePath, String packageName, String oldClassName) {
  227. try {
  228. String path = CamelCompiler.copyProcess(filePath,packageName,oldClassName);
  229. return Result.success(path);
  230. } catch (IOException e) {
  231. e.printStackTrace();
  232. return Result.error("复制新文件失败!");
  233. }
  234. }
  235. }