|
@ -3,15 +3,18 @@ package com.yihu.hos.services;
|
|
|
import com.yihu.ehr.framework.model.Result;
|
|
|
import com.yihu.ehr.framework.util.operator.ClassFileUtil;
|
|
|
import com.yihu.ehr.framework.util.operator.StringUtil;
|
|
|
import com.yihu.hos.model.CamelContextQueue;
|
|
|
import com.yihu.hos.model.SystemPathMapping;
|
|
|
import com.yihu.hos.common.classLoader.DynamicClassLoader;
|
|
|
import com.yihu.hos.common.constants.Constant;
|
|
|
import com.yihu.hos.models.SystemCamelContext;
|
|
|
import com.yihu.hos.models.SystemPathMapping;
|
|
|
import org.apache.camel.builder.RouteBuilder;
|
|
|
import org.apache.logging.log4j.LogManager;
|
|
|
import org.apache.logging.log4j.Logger;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.io.File;
|
|
|
import java.net.URL;
|
|
|
import java.util.Map;
|
|
|
import java.util.concurrent.SynchronousQueue;
|
|
|
|
|
|
/**
|
|
|
* Created by lingfeng on 2016/8/4.
|
|
@ -64,57 +67,83 @@ public class ESBCamelService {
|
|
|
* 当外界组件通知一个新的RouteDefine路由被定义时,该事件被触发
|
|
|
*/
|
|
|
public Result onRouteDefineAdded(String serviceFlow , String packageName , String className , String path) {
|
|
|
/*
|
|
|
* 当一个新的路由定义事件发生时,要做以下几件事情:
|
|
|
*
|
|
|
* 1、根据serviceFlow的信息,在ESB-Broker Server的映射容器中寻
|
|
|
* 找个业务系统定义的各种Server Class 文件在ESB-Broker Server节点本地存储的根路径
|
|
|
* 2、然后按照packageName、className、contents的信息将这个class文件写入到正确的位置
|
|
|
* 3、不能在本线程操作Apache Camel,只能通过一个同步队列通知Apache Camel主线程
|
|
|
* */
|
|
|
if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
}
|
|
|
// 第1、2两步处理过程,都是在这里完成
|
|
|
this.createClassfile(serviceFlow, packageName, className, path);
|
|
|
|
|
|
// 3、===============加载到CamelContext中
|
|
|
SynchronousQueue<String> camelContextOperateQueue = CamelContextQueue.getCamelCamelContextQueue();
|
|
|
try {
|
|
|
camelContextOperateQueue.put(packageName + "." + className);
|
|
|
} catch (InterruptedException e) {
|
|
|
logger.error(e.getMessage() , e);
|
|
|
if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
}
|
|
|
File systemClassRootPath = new File(ClassLoader.getSystemResource("").getPath() + "/" + serviceFlow);
|
|
|
if (!systemClassRootPath.exists()) {
|
|
|
systemClassRootPath.mkdirs();
|
|
|
}
|
|
|
// 记录到工具类中,以便其它线程需要时进行取用
|
|
|
SystemPathMapping.getSystemRootPathMapping().put(serviceFlow, systemClassRootPath.toURI().toURL());
|
|
|
// 第1、2两步处理过程,都是在这里完成
|
|
|
this.createClassfile(serviceFlow, packageName, className, path);
|
|
|
|
|
|
// 3、===============加载到CamelContext中
|
|
|
ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
|
|
|
Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) currentClassLoader.loadClass(serviceFlow + Constant.DOT + packageName + Constant.DOT + className);
|
|
|
if(routeBuilderClass != null) {
|
|
|
RouteBuilder routeBuilder = routeBuilderClass.newInstance();
|
|
|
SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
|
|
|
}
|
|
|
return Result.success("新增路由成功!");
|
|
|
} catch (Exception e) {
|
|
|
logger.error(e);
|
|
|
return Result.error("新增路由失败!");
|
|
|
}
|
|
|
|
|
|
return Result.success("新增路由成功!");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 当外界组件通知一个已有的RouteDefine路由定义被改变时,主要就是路由定义内容被改变时,该事件被触发。
|
|
|
*/
|
|
|
public Result onRouteDefineChanged(String serviceFlow, String packageName, String className, String path) {
|
|
|
if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
try {
|
|
|
if (StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
}
|
|
|
SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
|
|
|
SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
|
|
|
this.updateClassfile(serviceFlow, packageName, className, path);
|
|
|
// 3、===============加载到CamelContext中
|
|
|
DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
|
|
|
Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(ClassLoader.getSystemResource(Constant.EMPTY).getPath(),
|
|
|
serviceFlow + Constant.DOT + packageName + Constant.DOT + className + Constant.DOT + Constant.CLASS);
|
|
|
|
|
|
if (routeBuilderClass != null) {
|
|
|
RouteBuilder routeBuilder = routeBuilderClass.newInstance();
|
|
|
SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
|
|
|
}
|
|
|
return Result.success("修改路由成功!");
|
|
|
} catch (Exception e) {
|
|
|
return Result.error("修改路由失败!");
|
|
|
}
|
|
|
this.updateClassfile(serviceFlow, packageName, className, path);
|
|
|
return Result.success("修改路由成功!");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 当外界组件通知一个已有的RouteDefine路由定义被删除时,该事件被触发。
|
|
|
*/
|
|
|
public Result onRouteDefineDelete(String serviceFlow, String packageName, String className) {
|
|
|
if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
try {
|
|
|
if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
|
|
|
|| StringUtil.isEmpty(className)) {
|
|
|
logger.error("必要的入参数据不正确,请检查!");
|
|
|
return Result.error("必要的入参数据不正确,请检查!");
|
|
|
}
|
|
|
|
|
|
SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
|
|
|
SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
|
|
|
this.deleteClassfile(serviceFlow, packageName, className);
|
|
|
return Result.success("删除路由成功!");
|
|
|
} catch (Exception e) {
|
|
|
return Result.error("删除路由失败!");
|
|
|
}
|
|
|
this.deleteClassfile(serviceFlow, packageName, className);
|
|
|
return Result.success("删除路由成功!");
|
|
|
}
|
|
|
|
|
|
|
|
@ -130,7 +159,7 @@ public class ESBCamelService {
|
|
|
ClassFileUtil.createClassfile(systemRootURL, packageName, className, path);
|
|
|
|
|
|
// 完成
|
|
|
logger.info("===================" + packageName + "." + className + ".class 生成过程结束");
|
|
|
logger.info("===================" + packageName + Constant.DOT + className + ".class 生成过程结束");
|
|
|
}
|
|
|
|
|
|
private void updateClassfile(String serviceFlow, String packageName, String className, String path) {
|
|
@ -145,7 +174,7 @@ public class ESBCamelService {
|
|
|
ClassFileUtil.updateClassfile(systemRootURL, packageName, className, path);
|
|
|
|
|
|
// 完成
|
|
|
logger.info("===================" + packageName + "." + className + ".class 修改过程结束");
|
|
|
logger.info("===================" + packageName + Constant.DOT + className + ".class 修改过程结束");
|
|
|
}
|
|
|
|
|
|
private void deleteClassfile(String serviceFlow, String packageName, String className) {
|
|
@ -160,6 +189,6 @@ public class ESBCamelService {
|
|
|
ClassFileUtil.deleteClassfile(systemRootURL, packageName, className);
|
|
|
|
|
|
// 完成
|
|
|
logger.info("===================" + packageName + "." + className + ".class 删除过程结束");
|
|
|
logger.info("===================" + packageName + Constant.DOT + className + ".class 删除过程结束");
|
|
|
}
|
|
|
}
|