Commit 00ecf48a by huangfusuper

修改插件端项目扫描方式 将自动扫描改为手动配置!增加启动速度,减少资源消耗!

parent 21175ef9
......@@ -43,14 +43,14 @@
<artifactId>myth-executor-core</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/xstream/xstream -->
<dependency>
<groupId>xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.2.2</version>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.1</version>
</dependency>
</dependencies>
<distributionManagement>
......
package com.byit.enums;
/**
* @author huangfu
*/
public enum LauncherEnum {
XML_PORT_SET_ERROR("配置文件端口出现错误!"),
XML_DATA_ERROR("配置文件解析失败,或配置不正确!"),
XML_AUTO_VALUE_ERROR("自动扫描配置只能为true或者false"),
;
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
LauncherEnum(String msg) {
this.msg = msg;
}
}
package com.byit.exptions;
/**
* @author huangfu
*/
public class LauncherException extends RuntimeException {
public LauncherException(String message) {
super(message);
}
}
package com.byit.launcher;
import com.byit.annotations.JobHandler;
import com.byit.executor.handler.interfaces.IJobHandler;
import com.byit.model.PluginConfigModel;
import com.byit.rpc.ServerRunThread;
import com.byit.utils.XmlParseUtil;
import lombok.extern.slf4j.Slf4j;
/**
......@@ -11,22 +15,27 @@ import lombok.extern.slf4j.Slf4j;
**/
@Slf4j
public class JobRunServerLauncher {
private PluginConfigModel pluginConfigModel;
/**
* 线程是否已经被启动的标志
*/
public static volatile boolean THREAD_RUN_MARK = false;
public JobRunServerLauncher(int port) {
runServer(port);
public JobRunServerLauncher(String filePath) throws InterruptedException {
pluginConfigModel = new PluginConfigModel();
XmlParseUtil.parse(filePath,pluginConfigModel);
runServer();
}
/**
* 开始启动服务 设置启动标志
* @param port
*/
private void runServer(int port){
private void runServer() throws InterruptedException {
if(!THREAD_RUN_MARK){
new Thread(new ServerRunThread(port)).start();
new Thread(new ServerRunThread(pluginConfigModel)).start();
Thread.sleep(500);
log.info("---------------------线程启动------------------");
}
}
......
package com.byit.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 数据配置类
* @author huangfu
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PluginConfigModel {
private Integer port;
private List<String> classNames;
private Boolean authScan;
}
package com.byit.rpc;
import com.byit.launcher.JobRunServerLauncher;
import com.byit.model.PluginConfigModel;
import com.byit.scan.JarRunScanProject;
import com.byit.scan.LocalFolderRunScanProject;
import com.byit.scan.XmlRunPlugin;
import com.byit.scan.base.IScanProject;
import com.byit.utils.JobUtils;
import io.netty.bootstrap.ServerBootstrap;
......@@ -20,11 +22,13 @@ import lombok.extern.slf4j.Slf4j;
**/
@Slf4j
public class ServerRunThread implements Runnable {
private Integer port = 8989;
private Integer port;
public ServerRunThread(Integer port) {
public ServerRunThread(PluginConfigModel pluginConfigModel) {
//获取任务信息
IScanProject iScanProject;
//如果设置自动转给程序自身处理 如果设置手动就读取xml进行
if (pluginConfigModel.getAuthScan()) {
if(JobUtils.isJarRun()){
log.info("-------------------jar包运行--------------------");
iScanProject = new JarRunScanProject(JobUtils.filePath());
......@@ -32,10 +36,15 @@ public class ServerRunThread implements Runnable {
log.info("-------------------本地运行---------------------");
iScanProject = new LocalFolderRunScanProject();
}
}else{
log.info("-------------------本地配置文件运行--------------------");
iScanProject = new XmlRunPlugin(pluginConfigModel);
}
iScanProject.addJobCache();
JobRunServerLauncher.THREAD_RUN_MARK = true;
this.port = port;
this.port = pluginConfigModel.getPort();
}
@Override
......
package com.byit.scan;
import com.byit.annotations.JobHandler;
import com.byit.executor.handler.interfaces.IJobHandler;
import com.byit.scan.base.IScanProject;
import com.byit.utils.JobUtils;
import lombok.extern.slf4j.Slf4j;
......@@ -22,23 +21,11 @@ import java.util.jar.JarFile;
**/
@Slf4j
public class JarRunScanProject implements IScanProject {
/**
* 任务基类
*/
private static final Class<IJobHandler> JOB_ROOT_CLASS;
/**
* 任务注解类
*/
private static final Class<JobHandler> JOB_HANDLER_CLASS;
private static final String DOT_CLASS = ".class";
private static final String DOT_MF = ".MF";
private static String rootPath;
static {
JOB_ROOT_CLASS = IJobHandler.class;
JOB_HANDLER_CLASS = JobHandler.class;
}
public JarRunScanProject(String rootPath) {
JarRunScanProject.rootPath = rootPath;
}
......@@ -69,7 +56,6 @@ public class JarRunScanProject implements IScanProject {
Class objectiveClass = classLoader.loadClass(className);
if(JOB_ROOT_CLASS.isAssignableFrom(objectiveClass)){
if(objectiveClass.isAnnotationPresent(JOB_HANDLER_CLASS)){
System.out.println(className);
JobHandler annotation = (JobHandler)objectiveClass.getAnnotation(JOB_HANDLER_CLASS);
JobUtils.jobCache.put(annotation.value(),objectiveClass);
}
......
......@@ -17,19 +17,6 @@ import java.util.stream.Collectors;
* @date: 2019/11/29 10:42
**/
public class LocalFolderRunScanProject implements IScanProject {
/**
* 任务基类
*/
private static final Class<IJobHandler> JOB_ROOT_CLASS;
/**
* 任务注解类
*/
private static final Class<JobHandler> JOB_HANDLER_CLASS;
static {
JOB_ROOT_CLASS = IJobHandler.class;
JOB_HANDLER_CLASS = JobHandler.class;
}
/**
* 获取项目的根路径
......
package com.byit.scan;
import com.byit.annotations.JobHandler;
import com.byit.executor.handler.interfaces.IJobHandler;
import com.byit.model.PluginConfigModel;
import com.byit.scan.base.IScanProject;
import com.byit.utils.JobUtils;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
* @author huangfu
*/
@Slf4j
public class XmlRunPlugin implements IScanProject {
private PluginConfigModel pluginConfigModel;
public XmlRunPlugin(PluginConfigModel pluginConfigModel) {
this.pluginConfigModel = pluginConfigModel;
}
@Override
public void addJobCache() {
List<IJobHandler> iJobHandlers = instantiateJobHandler();
/**
* 添加到缓存
*/
iJobHandlers.forEach(iJobHandler -> {
Class<? extends IJobHandler> aClass = iJobHandler.getClass();
if (aClass.isAnnotationPresent(JOB_HANDLER_CLASS)) {
JobHandler annotation = aClass.getAnnotation(JOB_HANDLER_CLASS);
JobUtils.jobCache.put(annotation.value(),aClass);
}else{
log.warn("------{}被忽略,因为没有添加注解{}-------",iJobHandler,JOB_HANDLER_CLASS);
}
});
}
/**
* 实例化数据
* @return
*/
private List<IJobHandler> instantiateJobHandler(){
List<String> classNames = pluginConfigModel.getClassNames();
List<IJobHandler> iJobHandlers = new ArrayList<>(15);
classNames.forEach(className ->{
try {
Class<?> aClass = Class.forName(className);
Object o = aClass.newInstance();
if(o instanceof IJobHandler){
iJobHandlers.add((IJobHandler)o);
}else{
log.warn("---------{}被忽略,因为他不属于{}类型-------",o,JOB_ROOT_CLASS);
}
} catch (Exception e) {
e.printStackTrace();
}
});
return iJobHandlers;
}
}
package com.byit.scan.base;
import com.byit.annotations.JobHandler;
import com.byit.executor.handler.interfaces.IJobHandler;
/**
* @program: byit-myth-job->IScanProject
* @description: 扫描项目的基类
......@@ -9,6 +12,14 @@ package com.byit.scan.base;
**/
public interface IScanProject {
/**
* 任务基类
*/
Class<IJobHandler> JOB_ROOT_CLASS = IJobHandler.class;
/**
* 任务注解类
*/
Class<JobHandler> JOB_HANDLER_CLASS = JobHandler.class;
/**
* 将符合条件的任务添加到缓存层
*/
void addJobCache();
......
package com.byit.utils;
import com.byit.enums.LauncherEnum;
import com.byit.exptions.LauncherException;
import com.byit.model.PluginConfigModel;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author huangfu
*/
public class XmlParseUtil {
private final static String PORT = "port";
/**
* 将文档解析为文档类型的数据
* @param filePath xml文件地址
*/
public static void parse(String filePath,PluginConfigModel pluginConfigModel) {
URL resource = XmlParseUtil.class.getResource(filePath);
SAXReader reader = new SAXReader();
Document document;
try {
document = reader.read(resource);
} catch (DocumentException e) {
e.printStackTrace();
throw new LauncherException(LauncherEnum.XML_DATA_ERROR.getMsg());
}
Element rootElement = document.getRootElement();
if(rootElement == null){
throw new LauncherException(LauncherEnum.XML_DATA_ERROR.getMsg());
}
Element authScanElement = rootElement.element("auto-scan");
if(authScanElement == null){
pluginConfigModel.setAuthScan(false);
}else {
authScanParse(authScanElement,pluginConfigModel);
}
Element portElement = rootElement.element(PORT);
Element classNamesElement = rootElement.element("classNames");
if(portElement == null || classNamesElement == null){
throw new LauncherException(LauncherEnum.XML_DATA_ERROR.getMsg());
}
portParse(portElement,pluginConfigModel);
packageScanValueParse(classNamesElement,pluginConfigModel);
}
/**
* 自动扫描解析配置
* @param authScanElement 自动扫描
* @param pluginConfigModel 服务配置
*/
private static void authScanParse(Element authScanElement,PluginConfigModel pluginConfigModel){
String isScanStr = authScanElement.attributeValue("value");
try {
boolean isScan = Boolean.parseBoolean(isScanStr);
pluginConfigModel.setAuthScan(isScan);
}catch (Exception e){
e.printStackTrace();
throw new LauncherException(LauncherEnum.XML_PORT_SET_ERROR.getMsg());
}
}
/**
* 解析package
* @param packageRootElement 任务类
* @param pluginConfigModel 配置引用
*/
private static void packageScanValueParse(Element packageRootElement,PluginConfigModel pluginConfigModel){
Iterator<Element> elementIterator = packageRootElement.elementIterator();
while (elementIterator.hasNext()) {
Element packageElement = elementIterator.next();
String packageElementText = packageElement.getText();
if(pluginConfigModel.getClassNames() == null){
pluginConfigModel.setClassNames(new ArrayList<>(8));
}
pluginConfigModel.getClassNames().add(packageElementText);
}
}
/**
* 端口解析
* @param portElement 端口
* @param pluginConfigModel 配置引用
*/
private static void portParse(Element portElement,PluginConfigModel pluginConfigModel){
String portStr = portElement.getText();
try {
int port = Integer.parseInt(portStr.trim());
pluginConfigModel.setPort(port);
}catch (Exception e){
e.printStackTrace();
throw new LauncherException(LauncherEnum.XML_PORT_SET_ERROR.getMsg());
}
}
public static void main(String[] args) {
parse("/plugin.xml",new PluginConfigModel());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<executor-plugin>
<port>8989</port>
<classNames>
<className>com.byit.model.PluginConfigModel</className>
<className>com.byit.model.PluginConfigModel</className>
<className>com.byit.model.PluginConfigModel</className>
<className>com.byit.model.PluginConfigModel</className>
<className>com.byit.model.PluginConfigModel</className>
<className>com.byit.model.PluginConfigModel</className>
</classNames>
</executor-plugin>
\ No newline at end of file
package com.byit.job;
import com.byit.launcher.JobRunServerLauncher;
import com.byit.utils.JobUtils;
import java.io.IOException;
......@@ -11,8 +12,11 @@ import java.io.IOException;
* @date: 2019/11/20 12:18
**/
public class Mains {
public static void main(String[] args) throws IOException {
new JobRunServerLauncher(8888);
public static void main(String[] args) throws InterruptedException {
new JobRunServerLauncher("/plugin.xml");
JobUtils.jobCache.forEach((key,value) ->{
System.out.println(key);
});
}
}
<?xml version="1.0" encoding="UTF-8"?>
<executor-plugin>
<port>8899</port>
<auto-scan value="false"></auto-scan>
<classNames>
<className>com.byit.job.DemoJob</className>
<className>com.byit.job.EndNode</className>
<className>com.byit.job.StartNode</className>
</classNames>
</executor-plugin>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment