ESBCamelService.java 10 KB

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