123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393 |
- package com.yihu.hos.services;
- import com.mongodb.client.MongoDatabase;
- import com.yihu.hos.common.classLoader.DynamicClassLoader;
- import com.yihu.hos.common.compiler.CamelCompiler;
- import com.yihu.hos.common.compiler.ClassParams;
- import com.yihu.hos.common.configuration.MongoConfiguration;
- import com.yihu.hos.common.constants.BrokerConstant;
- import com.yihu.hos.core.constants.CoreConstant;
- import com.yihu.hos.core.datatype.ClassFileUtil;
- import com.yihu.hos.core.datatype.StringUtil;
- import com.yihu.hos.core.encrypt.DES;
- import com.yihu.hos.models.SystemCamelContext;
- import com.yihu.hos.models.SystemClassMapping;
- import com.yihu.hos.web.framework.model.Result;
- import com.yihu.hos.web.framework.util.GridFSUtil;
- import org.apache.camel.Processor;
- import org.apache.camel.builder.RouteBuilder;
- import org.apache.log4j.LogManager;
- import org.apache.log4j.Logger;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.net.URLClassLoader;
- import java.util.Map;
- /**
- * Created by lingfeng on 2016/8/4.
- */
- @Service("ESBCamelService")
- public class ESBCamelService {
- public static final String BEAN_ID = "ESBCamelService";
- @Autowired
- private MongoConfiguration mongoConfig;
- private String dbName = "upload";
- private static Logger logger = LogManager.getLogger(ESBCamelService.class);
- /**
- * 当外界组件通知一个新的processor处理器被定义时,该事件被触发。
- * @param serviceFlow 本次processor处理器变化,所涉及的业务系统唯一标识。
- * @param packageName processor处理器定义涉及的class包名
- * @param className processor处理器定义涉及的class类名
- * @param path processor处理器定义涉及的class对应路径
- */
- public Result onProcessorAdded(String serviceFlow, String packageName, String className, String path) {
- try {
- if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
- || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- FileOutputStream out = this.createClassfile(serviceFlow, packageName, className, BrokerConstant.PROCESSOR);
- String fileName = DES.decrypt(path, DES.COMMON_PASSWORD);
- MongoDatabase db = mongoConfig.mongoClient().getDatabase(dbName);
- if (GridFSUtil.readFile(db, out, fileName)) {
- return Result.success("新增处理器成功!");
- } else {
- return Result.error("新增处理器失败!");
- }
- } catch (Exception e) {
- logger.error(e);
- return Result.error("新增处理器失败!");
- }
- }
- /**
- * 当外界组件通知一个已有的processor处理器data部分发生变化时,该事件被触发。
- */
- public Result onProcessorDataChanged(String serviceFlow , String packageName , String className , String path) {
- try {
- if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
- || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- FileOutputStream out = this.updateClassfile(serviceFlow, packageName, className, BrokerConstant.PROCESSOR);
- String fileName = DES.decrypt(path, DES.COMMON_PASSWORD);
- MongoDatabase db = mongoConfig.mongoClient().getDatabase(dbName);
- if (GridFSUtil.readFile(db, out, fileName)) {
- SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
- SystemCamelContext.getDefaultCamelContext().removeRoute(serviceFlow);
- DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
- Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE + className));
- classLoader.loadClass(ClassLoader.getSystemResource(CoreConstant.EMPTY).getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.PROCESSOR + className));
- if (routeBuilderClass != null) {
- RouteBuilder routeBuilder = routeBuilderClass.newInstance();
- SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
- return Result.success("修改处理器成功!");
- }
- }
- return Result.error("修改处理器失败!");
- } catch (Exception e) {
- logger.error(e);
- return Result.error("修改处理器失败!");
- }
- }
- /**
- * 当外界组件通知一个已有的Processor路由定义被删除时,该事件被触发。
- */
- public Result onProcessorDataDelete(String serviceFlow, String packageName, String className) {
- 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, BrokerConstant.PROCESSOR);
- return Result.success("删除路由成功!");
- } catch (Exception e) {
- return Result.error("删除路由失败!");
- }
- }
- /**
- * 当外界组件通知一个新的RouteDefine路由被定义时,该事件被触发
- */
- public Result onRouteDefineAdded(String serviceFlow, String packageName, String className, String path) {
- try {
- if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
- || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- // 第1、2两步处理过程,都是在这里完成
- FileOutputStream out = this.createClassfile(serviceFlow, packageName, className, BrokerConstant.ROUTE);
- String fileName = DES.decrypt(path, DES.COMMON_PASSWORD);
- MongoDatabase db = mongoConfig.mongoClient().getDatabase(dbName);
- if (GridFSUtil.readFile(db, out, fileName)) {
- // 3、===============加载到CamelContext中
- DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
- Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE + className));
- if(routeBuilderClass != null) {
- RouteBuilder routeBuilder = routeBuilderClass.newInstance();
- SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
- }
- return Result.success("新增路由成功!");
- } else {
- return Result.error("新增路由失败!");
- }
- } catch (Exception e) {
- logger.error(e);
- return Result.error("新增路由失败!");
- }
- }
- /**
- * 当外界组件通知一个已有的RouteDefine路由定义被改变时,主要就是路由定义内容被改变时,该事件被触发。
- */
- public Result onRouteDefineChanged(String serviceFlow, String packageName, String className, String path) {
- 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);
- FileOutputStream out = this.updateClassfile(serviceFlow, packageName, className, BrokerConstant.ROUTE);
- String fileName = DES.decrypt(path, DES.COMMON_PASSWORD);
- MongoDatabase db = mongoConfig.mongoClient().getDatabase(dbName);
- if (GridFSUtil.readFile(db, out, fileName)) {
- // 3、===============加载到CamelContext中
- DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
- Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(ClassLoader.getSystemResource(CoreConstant.EMPTY).getPath(), SystemClassMapping.getSystemClassNameMapping().get(serviceFlow + BrokerConstant.ROUTE+className));
- if (routeBuilderClass != null) {
- RouteBuilder routeBuilder = routeBuilderClass.newInstance();
- SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
- return Result.success("修改路由成功!");
- }
- }
- return Result.error("修改路由失败!");
- } catch (Exception e) {
- return Result.error("修改路由失败!");
- }
- }
- /**
- * 当外界组件通知一个已有的RouteDefine路由定义被删除时,该事件被触发。
- */
- public Result onRouteDefineDelete(String serviceFlow, String packageName, String className) {
- 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, BrokerConstant.ROUTE);
- return Result.success("删除路由成功!");
- } catch (Exception e) {
- return Result.error("删除路由失败!");
- }
- }
- /**
- * 启动路由时,该事件被触发。
- */
- public Result onRouteDefineStart(String serviceFlow) {
- try {
- if(StringUtil.isEmpty(serviceFlow)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- SystemCamelContext.getDefaultCamelContext().startRoute(serviceFlow);
- return Result.success("启动路由成功!");
- } catch (Exception e) {
- return Result.error("启动路由失败!");
- }
- }
- /**
- * 停止路由时,该事件被触发。
- */
- public Result onRouteDefineStop(String serviceFlow) {
- try {
- if(StringUtil.isEmpty(serviceFlow)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- SystemCamelContext.getDefaultCamelContext().stopRoute(serviceFlow);
- return Result.success("停止路由成功!");
- } catch (Exception e) {
- return Result.error("停止路由失败!");
- }
- }
- private FileOutputStream createClassfile(String serviceFlow, String packageName, String className, String type) throws MalformedURLException {
- // 1、============
- File systemClassFlowPath = new File(this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath());
- // 记录到工具类中,以便其它线程需要时进行取用
- SystemClassMapping.getSystemClassNameMapping().put(serviceFlow + type + className, packageName + CoreConstant.DOT + className);
- // 2、============开始写入class文件
- FileOutputStream out = ClassFileUtil.createClassfile(systemClassFlowPath.toURI().toURL(), packageName, className);
- // 完成
- logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 生成过程结束");
- return out;
- }
- private FileOutputStream updateClassfile(String serviceFlow, String packageName, String className, String type) throws MalformedURLException {
- // 1、============
- Map<String, String> systemClassNameMapping = SystemClassMapping.getSystemClassNameMapping();
- String systemClassName = systemClassNameMapping.get(serviceFlow + type + className);
- if(StringUtil.isEmpty(systemClassName)) {
- return null;
- }
- File systemClassFlowPath = new File(this.getClass().getProtectionDomain().getClassLoader().getResource("").getPath());
- // 2、============开始写入class文件
- FileOutputStream out = ClassFileUtil.updateClassfile(systemClassFlowPath.toURI().toURL(), packageName, className);
- // 完成
- logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 修改过程结束");
- return out;
- }
- private void deleteClassfile(String serviceFlow, String packageName, String className, String type) {
- // 1、============
- Map<String, String> systemClassNameMapping = SystemClassMapping.getSystemClassNameMapping();
- String systemClassName = systemClassNameMapping.get(serviceFlow + type + className);
- if(StringUtil.isEmpty(systemClassName)) {
- return;
- }
- String packagePath = StringUtil.replaceStrAll(packageName, ".", "/");
- String classPath = ClassLoader.getSystemResource("").getPath() + "/" + packagePath + "/" + className + ".class";
- // 2、============开始写入class文件
- ClassFileUtil.deleteClassfile(classPath);
- // 完成
- logger.info("===================" + packageName + CoreConstant.DOT + className + ".class 删除过程结束");
- }
- /* ************************** 修改任务cron生成新的camel文件 add by hzy *********************************** */
- public Result onProcessorClassAdded(String serviceFlow, String packageName, String className, String path) {
- try {
- if(StringUtil.isEmpty(serviceFlow) || StringUtil.isEmpty(packageName)
- || StringUtil.isEmpty(className) || StringUtil.isEmpty(path)) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- return this.genProcessorFile(serviceFlow, packageName, className, path);
- } catch (Exception e) {
- e.printStackTrace();
- logger.error(e);
- return Result.error("新增处理器失败!");
- }
- }
- /**
- * 当外界组件通知一个新的RouteDefine路由被定义时,该事件被触发
- */
- public Result onRouteClassAdded(ClassParams params) {
- try {
- if(StringUtil.isEmpty(params.getRouteId()) || StringUtil.isEmpty(params.getPackageName())
- || StringUtil.isEmpty(params.getOldClassName()) || StringUtil.isEmpty(params.getFilePath())) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- // 第1、2两步处理过程,都是在这里完成
- this.genRouteFile(params);
- // 3、===============加载到CamelContext中
- ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();
- Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) currentClassLoader.loadClass(SystemClassMapping.getSystemClassNameMapping().get(params.getRouteId() + BrokerConstant.ROUTE + params.getNewClassName()));
- if(routeBuilderClass != null) {
- RouteBuilder routeBuilder = routeBuilderClass.newInstance();
- SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
- }
- return Result.success("新增路由成功!");
- } catch (Exception e) {
- e.printStackTrace();
- logger.error(e);
- return Result.error("新增路由失败!");
- }
- }
- public Result onRouteClassChanged(ClassParams params) {
- try {
- if(StringUtil.isEmpty(params.getRouteId()) || StringUtil.isEmpty(params.getPackageName())
- || StringUtil.isEmpty(params.getOldClassName()) || StringUtil.isEmpty(params.getFilePath())) {
- logger.error("必要的入参数据不正确,请检查!");
- return Result.error("必要的入参数据不正确,请检查!");
- }
- // 第1、2两步处理过程,都是在这里完成
- SystemCamelContext.getDefaultCamelContext().stopRoute(params.getRouteId());
- SystemCamelContext.getDefaultCamelContext().removeRoute(params.getRouteId());
- this.genRouteFile(params);
- // 3、===============加载到CamelContext中
- DynamicClassLoader classLoader = new DynamicClassLoader(DynamicClassLoader.class.getClassLoader());
- Class<RouteBuilder> routeBuilderClass = (Class<RouteBuilder>) classLoader.loadClass(ClassLoader.getSystemResource(CoreConstant.EMPTY).getPath(), SystemClassMapping.getSystemClassNameMapping().get(params.getRouteId() + BrokerConstant.ROUTE + params.getNewClassName()));
- if (routeBuilderClass != null) {
- RouteBuilder routeBuilder = routeBuilderClass.newInstance();
- SystemCamelContext.getDefaultCamelContext().addRoutes(routeBuilder);
- }
- return Result.success("新增路由成功!");
- } catch (Exception e) {
- e.printStackTrace();
- logger.error(e);
- return Result.error("新增路由失败!");
- }
- }
- public Result genProcessorFile(String serviceFlow, String packageName, String className, String path) {
- try {
- String filePath= CamelCompiler.genProcessClass(serviceFlow, path, packageName, className);
- if (filePath !=null){
- return Result.success(filePath);
- }else {
- return Result.error("生成新文件失败1!");
- }
- } catch (IOException e) {
- e.printStackTrace();
- return Result.error("生成新文件失败2!");
- }
- }
- public Result genRouteFile(ClassParams params) {
- try {
- String path = CamelCompiler.genRouteClass(params);
- return Result.success(path);
- } catch (IOException e) {
- e.printStackTrace();
- return Result.error("生成新文件失败!");
- }
- }
- }
|