From bc2ea967a09f6942eccd0b84d8280567bc488e3b Mon Sep 17 00:00:00 2001 From: yuye <631941527@qq.com> Date: Sat, 17 Aug 2019 14:31:44 +0800 Subject: [PATCH] add mars-timer --- .../java/com/mars/aop/proxy/CglibProxy.java | 6 +- mars-core/mars-core.iml | 16 ++- .../java/com/mars/core/after/StartAfter.java | 11 ++ .../com/mars/core/annotation/MarsTimer.java | 2 +- .../com/mars/core/constant/MarsConstant.java | 9 ++ .../java/com/mars/core/load/LoadHelper.java | 118 ++++++++++++++++++ .../java/com/mars/core/load/WriteFields.java | 5 +- .../com/mars/core/model/MarsTimerModel.java | 76 +++++++++++ .../com/mars/ioc/factory/BeanFactory.java | 9 +- .../java/com/mars/ioc/load/LoadEasyBean.java | 29 ++--- .../com/mars/mvc/load/LoadController.java | 18 +-- .../com/mars/netty/server/MarsServer.java | 10 ++ mars-start/mars-start-base/pom.xml | 5 + .../com/mars/start/base/BaseStartMars.java | 24 +++- .../src/main/resources/demo/mars.yml | 2 +- .../main/java/com/mars/start/StartMars.java | 4 +- .../main/java/com/mars/start/StartMars.java | 4 +- .../main/java/com/mars/start/StartMars.java | 4 +- mars-timer/pom.xml | 26 ++++ .../mars/timer/execute/ExecuteMarsTimer.java | 57 +++++++++ .../com/mars/timer/load/LoadMarsTimer.java | 69 ++++++++++ pom.xml | 16 ++- 22 files changed, 455 insertions(+), 65 deletions(-) create mode 100644 mars-core/src/main/java/com/mars/core/load/LoadHelper.java create mode 100644 mars-core/src/main/java/com/mars/core/model/MarsTimerModel.java create mode 100644 mars-timer/pom.xml create mode 100644 mars-timer/src/main/java/com/mars/timer/execute/ExecuteMarsTimer.java create mode 100644 mars-timer/src/main/java/com/mars/timer/load/LoadMarsTimer.java diff --git a/mars-aop/src/main/java/com/mars/aop/proxy/CglibProxy.java b/mars-aop/src/main/java/com/mars/aop/proxy/CglibProxy.java index 3d6acce..adec666 100644 --- a/mars-aop/src/main/java/com/mars/aop/proxy/CglibProxy.java +++ b/mars-aop/src/main/java/com/mars/aop/proxy/CglibProxy.java @@ -44,8 +44,12 @@ public class CglibProxy implements MethodInterceptor { @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { Object obj = null; + Class c = null; + AopModel aopModel = list.get(method.getName()); - Class c = aopModel.getCls(); + if(aopModel != null){ + c = aopModel.getCls(); + } if(c != null){ obj = c.getDeclaredConstructor().newInstance(); if(c.getName().equals(MarsConstant.TRACTION_CLASS)){ diff --git a/mars-core/mars-core.iml b/mars-core/mars-core.iml index d3b77a5..e8eeba7 100644 --- a/mars-core/mars-core.iml +++ b/mars-core/mars-core.iml @@ -5,6 +5,7 @@ + @@ -14,8 +15,21 @@ - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/mars-core/src/main/java/com/mars/core/after/StartAfter.java b/mars-core/src/main/java/com/mars/core/after/StartAfter.java index 461dddd..61fe693 100644 --- a/mars-core/src/main/java/com/mars/core/after/StartAfter.java +++ b/mars-core/src/main/java/com/mars/core/after/StartAfter.java @@ -2,9 +2,13 @@ package com.mars.core.after; import com.mars.core.constant.MarsConstant; import com.mars.core.constant.MarsSpace; +import com.mars.core.load.LoadHelper; +import com.mars.core.load.WriteFields; +import com.mars.core.model.MarsBeanModel; import java.lang.reflect.Method; import java.util.List; +import java.util.Map; /** * 框架启动后立刻执行 @@ -24,8 +28,15 @@ public class StartAfter { if(afterObjects != null) { List easyLoads = (List)afterObjects; + Map beanModelMap = LoadHelper.getBeanObjectMap(); + for(Class cls : easyLoads){ Object obj = cls.getDeclaredConstructor().newInstance(); + + /* 注入属性 */ + WriteFields.writeFields(cls,obj,beanModelMap); + + /* 执行after方法 */ Method method2 = cls.getDeclaredMethod("after"); method2.invoke(obj); } diff --git a/mars-core/src/main/java/com/mars/core/annotation/MarsTimer.java b/mars-core/src/main/java/com/mars/core/annotation/MarsTimer.java index 945c7d8..4953416 100644 --- a/mars-core/src/main/java/com/mars/core/annotation/MarsTimer.java +++ b/mars-core/src/main/java/com/mars/core/annotation/MarsTimer.java @@ -11,5 +11,5 @@ public @interface MarsTimer { * 循环间隔 * @return */ - long loop(); + int loop() default 60000; } diff --git a/mars-core/src/main/java/com/mars/core/constant/MarsConstant.java b/mars-core/src/main/java/com/mars/core/constant/MarsConstant.java index 5d0087c..9325f34 100644 --- a/mars-core/src/main/java/com/mars/core/constant/MarsConstant.java +++ b/mars-core/src/main/java/com/mars/core/constant/MarsConstant.java @@ -33,6 +33,10 @@ public class MarsConstant { * 记录是否已经调用完createBean方法了 */ public static final String HAS_START="hasStart"; + /** + * 记录netty是否已经启动了 + */ + public static final String HAS_NETTY_START="hasNettyStart"; /** * 记录是否已经启动过单测了 */ @@ -68,6 +72,11 @@ public class MarsConstant { */ public static final String MARS_BEAN_OBJECTS = "marsBeanObjects"; + /** + * 所有加了MarsTimer注解的方法 + */ + public static final String MARS_TIMER_OBJECTS = "marsTimerObjects"; + /** * 接受远程配置中心通知的controller */ diff --git a/mars-core/src/main/java/com/mars/core/load/LoadHelper.java b/mars-core/src/main/java/com/mars/core/load/LoadHelper.java new file mode 100644 index 0000000..d2c6d46 --- /dev/null +++ b/mars-core/src/main/java/com/mars/core/load/LoadHelper.java @@ -0,0 +1,118 @@ +package com.mars.core.load; + +import com.mars.core.annotation.MarsBean; +import com.mars.core.annotation.Resource; +import com.mars.core.constant.MarsConstant; +import com.mars.core.constant.MarsSpace; +import com.mars.core.model.MarsBeanModel; +import com.mars.core.model.MarsTimerModel; +import com.mars.core.util.StringUtil; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 加载工具类 + */ +public class LoadHelper { + + /** + * 获取全局存储空间 + */ + private static MarsSpace constants = MarsSpace.getEasySpace(); + + /** + * 获取Bean的名称 + * @param map + * @param cls + * @return + */ + public static String getBeanName(Map map,Class cls){ + MarsBean marsBean = (MarsBean)map.get("annotation"); + String beanName = marsBean.value(); + return getBeanName(beanName,cls); + } + + /** + * 获取Bean的名称 + * @param cls + * @return + */ + public static String getBeanName(String beanName,Class cls){ + if(beanName == null || beanName.equals("")) { + beanName = StringUtil.getFirstLowerCase(cls.getSimpleName()); + } + return beanName; + } + + /** + * 获取字段名 + * @param resource + * @param f + * @return + */ + public static String getResourceName(Resource resource, Field f){ + String filedName = resource.value(); + if(filedName == null || filedName.equals("")) { + filedName = f.getName(); + } + return filedName; + } + + /** + * 获取所有的加了MarsBean注解的基础数据 + * @return + */ + public static List> getBeanList(){ + /* 获取所有的bean数据 */ + Object marsBeans = constants.getAttr(MarsConstant.MARS_BEANS); + List> marsBeansList = new ArrayList<>(); + if(marsBeans != null) { + marsBeansList = (List>)marsBeans; + } + return marsBeansList; + } + + /** + * 获取所有的bean对象 + */ + public static Map getBeanObjectMap(){ + /* 创建bean对象,并保存起来 */ + Object objs2 = constants.getAttr(MarsConstant.MARS_BEAN_OBJECTS); + Map marsBeanObjects = new HashMap<>(); + if(objs2 != null) { + marsBeanObjects = (Map)objs2; + } + return marsBeanObjects; + } + + /** + * 获取所有配了定时任务的基础数据 + * @return + */ + public static List getMarsTimersList(){ + Object objs = constants.getAttr(MarsConstant.MARS_TIMER_OBJECTS); + List marsTimerObjects = new ArrayList<>(); + if(objs != null) { + marsTimerObjects = (List)objs; + } + return marsTimerObjects; + } + + /** + * 获取所有的加了Controller注解的基础数据 + * @return + */ + public static List> getControllerList(){ + /* 获取所有的controller数据 */ + Object objs = constants.getAttr(MarsConstant.CONTROLLERS); + List> contorls = new ArrayList<>(); + if(objs != null) { + contorls = (List>)objs; + } + return contorls; + } +} diff --git a/mars-core/src/main/java/com/mars/core/load/WriteFields.java b/mars-core/src/main/java/com/mars/core/load/WriteFields.java index 98a3140..4125f17 100644 --- a/mars-core/src/main/java/com/mars/core/load/WriteFields.java +++ b/mars-core/src/main/java/com/mars/core/load/WriteFields.java @@ -28,10 +28,7 @@ public class WriteFields { if(resource!=null){ f.setAccessible(true); - String filedName = resource.value(); - if(filedName == null || filedName.equals("")) { - filedName = f.getName(); - } + String filedName = LoadHelper.getResourceName(resource,f); MarsBeanModel beanModel = marsBeanObjects.get(filedName); if(beanModel!=null){ diff --git a/mars-core/src/main/java/com/mars/core/model/MarsTimerModel.java b/mars-core/src/main/java/com/mars/core/model/MarsTimerModel.java new file mode 100644 index 0000000..d4a2e1e --- /dev/null +++ b/mars-core/src/main/java/com/mars/core/model/MarsTimerModel.java @@ -0,0 +1,76 @@ +package com.mars.core.model; + +import com.mars.core.annotation.MarsTimer; + +import java.lang.reflect.Method; + +/** + * 定时任务实体类 + */ +public class MarsTimerModel { + + /** + * method名称 + */ + private String methodName; + + /** + * 要执行的方法 + */ + private Method method; + + /** + * 定时任务注解 + */ + private MarsTimer marsTimer; + + /** + * bean对象 + */ + private Object obj; + + /** + * class对象 + */ + private Class cls; + + public String getMethodName() { + return methodName; + } + + public void setMethodName(String methodName) { + this.methodName = methodName; + } + + public Object getObj() { + return obj; + } + + public void setObj(Object obj) { + this.obj = obj; + } + + public Class getCls() { + return cls; + } + + public void setCls(Class cls) { + this.cls = cls; + } + + public Method getMethod() { + return method; + } + + public void setMethod(Method method) { + this.method = method; + } + + public MarsTimer getMarsTimer() { + return marsTimer; + } + + public void setMarsTimer(MarsTimer marsTimer) { + this.marsTimer = marsTimer; + } +} diff --git a/mars-ioc/src/main/java/com/mars/ioc/factory/BeanFactory.java b/mars-ioc/src/main/java/com/mars/ioc/factory/BeanFactory.java index 97788ee..6468006 100644 --- a/mars-ioc/src/main/java/com/mars/ioc/factory/BeanFactory.java +++ b/mars-ioc/src/main/java/com/mars/ioc/factory/BeanFactory.java @@ -9,6 +9,7 @@ import com.mars.core.constant.MarsSpace; import com.mars.core.logger.MarsLogger; import com.mars.core.model.AopModel; import com.mars.core.model.MarsBeanModel; +import com.mars.core.load.LoadHelper; import java.lang.reflect.Method; import java.util.HashMap; @@ -109,13 +110,7 @@ public class BeanFactory { */ public static T getBean(String name,Class cls) throws Exception { try { - - Object marsBeans = constants.getAttr(MarsConstant.MARS_BEAN_OBJECTS); - Map marsBeanObjects = new HashMap<>(); - if(marsBeans != null) { - marsBeanObjects = (Map)marsBeans; - } - + Map marsBeanObjects = LoadHelper.getBeanObjectMap(); return (T)marsBeanObjects.get(name).getObj(); } catch (Exception e) { throw new Exception("找不到name为["+name+"]的bean",e); diff --git a/mars-ioc/src/main/java/com/mars/ioc/load/LoadEasyBean.java b/mars-ioc/src/main/java/com/mars/ioc/load/LoadEasyBean.java index bae187b..5193c38 100644 --- a/mars-ioc/src/main/java/com/mars/ioc/load/LoadEasyBean.java +++ b/mars-ioc/src/main/java/com/mars/ioc/load/LoadEasyBean.java @@ -1,14 +1,12 @@ package com.mars.ioc.load; -import com.mars.core.annotation.MarsBean; import com.mars.core.constant.MarsConstant; import com.mars.core.constant.MarsSpace; import com.mars.core.load.WriteFields; import com.mars.core.model.MarsBeanModel; -import com.mars.core.util.StringUtil; +import com.mars.core.load.LoadHelper; import com.mars.ioc.factory.BeanFactory; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,29 +28,16 @@ public class LoadEasyBean { public static void loadBean() throws Exception{ try { /* 获取所有的bean数据 */ - Object marsBeans = constants.getAttr(MarsConstant.MARS_BEANS); - List> marsBeansList = null; - if(marsBeans != null) { - marsBeansList = (List>)marsBeans; - } else { - return; - } + List> marsBeansList = LoadHelper.getBeanList(); /* 创建bean对象,并保存起来 */ - Object objs2 = constants.getAttr(MarsConstant.MARS_BEAN_OBJECTS); - Map marsBeanObjects = new HashMap<>(); - if(objs2 != null) { - marsBeanObjects = (Map)objs2; - } + Map marsBeanObjects = LoadHelper.getBeanObjectMap(); + for(Map map : marsBeansList) { - + Class cls = (Class)map.get("className"); - MarsBean marsBean = (MarsBean)map.get("annotation"); - - String beanName = marsBean.value(); - if(beanName == null || beanName.equals("")) { - beanName = StringUtil.getFirstLowerCase(cls.getSimpleName()); - } + String beanName = LoadHelper.getBeanName(map,cls); + if(marsBeanObjects.get(beanName) == null) { MarsBeanModel beanModel = new MarsBeanModel(); beanModel.setName(beanName); diff --git a/mars-mvc/src/main/java/com/mars/mvc/load/LoadController.java b/mars-mvc/src/main/java/com/mars/mvc/load/LoadController.java index c5c37b3..60afde9 100644 --- a/mars-mvc/src/main/java/com/mars/mvc/load/LoadController.java +++ b/mars-mvc/src/main/java/com/mars/mvc/load/LoadController.java @@ -1,6 +1,7 @@ package com.mars.mvc.load; import com.mars.core.load.WriteFields; +import com.mars.core.load.LoadHelper; import com.mars.mvc.proxy.MvcCglibProxy; import com.mars.core.annotation.MarsMapping; import com.mars.core.constant.MarsConstant; @@ -34,17 +35,11 @@ public class LoadController { Map controlObjects = new HashMap<>(); /* 获取所有的controller数据 */ - Object objs = constants.getAttr(MarsConstant.CONTROLLERS); - List> contorls = null; - if(objs != null) { - contorls = (List>)objs; - } else { - return; - } + List> controlList = LoadHelper.getControllerList(); Map marsBeanObjs = getMarsBeans(); - for(Map map : contorls) { + for(Map map : controlList) { Class cls = (Class)map.get("className"); @@ -104,11 +99,6 @@ public class LoadController { * @return duix */ private static Map getMarsBeans() { - Object objs = constants.getAttr(MarsConstant.MARS_BEAN_OBJECTS); - Map easyBeanObjs = new HashMap<>(); - if(objs != null) { - easyBeanObjs = (Map)objs; - } - return easyBeanObjs; + return LoadHelper.getBeanObjectMap(); } } diff --git a/mars-netty/src/main/java/com/mars/netty/server/MarsServer.java b/mars-netty/src/main/java/com/mars/netty/server/MarsServer.java index df1bc03..550aa35 100644 --- a/mars-netty/src/main/java/com/mars/netty/server/MarsServer.java +++ b/mars-netty/src/main/java/com/mars/netty/server/MarsServer.java @@ -1,5 +1,7 @@ package com.mars.netty.server; +import com.mars.core.constant.MarsConstant; +import com.mars.core.constant.MarsSpace; import com.mars.core.logger.MarsLogger; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; @@ -15,6 +17,11 @@ import io.netty.channel.socket.nio.NioServerSocketChannel; public class MarsServer { private static MarsLogger log = MarsLogger.getLogger(MarsServer.class); + + /** + * 获取全局存储空间 + */ + private static MarsSpace constants = MarsSpace.getEasySpace(); /** * 启动netty服务 @@ -35,6 +42,9 @@ public class MarsServer { log.info("启动成功"); + /* 标识netty是否已经启动 */ + constants.setAttr(MarsConstant.HAS_NETTY_START,"yes"); + f.channel().closeFuture().sync(); } catch (Exception e) { log.error("启动netty报错",e); diff --git a/mars-start/mars-start-base/pom.xml b/mars-start/mars-start-base/pom.xml index c331e43..3522d91 100644 --- a/mars-start/mars-start-base/pom.xml +++ b/mars-start/mars-start-base/pom.xml @@ -27,6 +27,11 @@ mars-junit ${project.parent.version} + + com.github.yuyenews + mars-timer + ${project.parent.version} + \ No newline at end of file diff --git a/mars-start/mars-start-base/src/main/java/com/mars/start/base/BaseStartMars.java b/mars-start/mars-start-base/src/main/java/com/mars/start/base/BaseStartMars.java index 387adff..bcd2c3b 100644 --- a/mars-start/mars-start-base/src/main/java/com/mars/start/base/BaseStartMars.java +++ b/mars-start/mars-start-base/src/main/java/com/mars/start/base/BaseStartMars.java @@ -7,12 +7,17 @@ import com.mars.core.constant.MarsSpace; import com.mars.core.load.LoadClass; import com.mars.core.logger.MarsLogger; import com.mars.core.util.ConfigUtil; +import com.mars.junit.StartList; import com.mars.mvc.load.LoadInters; import com.mars.netty.server.MarsServer; import com.mars.ioc.load.LoadEasyBean; import com.mars.jdbc.base.BaseInitJdbc; import com.mars.mvc.load.LoadController; import com.mars.mvc.servlet.MarsCoreServlet; +import com.mars.timer.execute.ExecuteMarsTimer; +import com.mars.timer.load.LoadMarsTimer; + +import java.util.List; /** * 启动Mars框架 @@ -32,7 +37,7 @@ public class BaseStartMars { * 启动Mars框架 * @param clazz */ - public static void start(Class clazz, BaseInitJdbc baseInitJdbc,String suffix) { + public static void start(Class clazz, BaseInitJdbc baseInitJdbc, String suffix, List startList) { try { log.info("程序启动中......"); @@ -40,12 +45,19 @@ public class BaseStartMars { /* 加载框架数据 */ load(clazz,baseInitJdbc,suffix); - /* 标识createBean方法已经调用完毕 */ - constants.setAttr(MarsConstant.HAS_START,"yes"); + /* 扩展要加载的东西 */ + if(startList != null){ + for(StartList item : startList){ + item.load(); + } + } /* 启动after方法 */ StartAfter.after(); + /* 执行定时任务 */ + ExecuteMarsTimer.execute(); + /* 启动netty */ MarsServer.start(getPort()); @@ -89,6 +101,12 @@ public class BaseStartMars { /* 创建interceptor对象 */ LoadInters.loadIntersList(); + + /* 标识createBean方法已经调用完毕 */ + constants.setAttr(MarsConstant.HAS_START,"yes"); + + /* 加载timer对象 */ + LoadMarsTimer.loadMarsTimers(); } /** diff --git a/mars-start/mars-start-base/src/main/resources/demo/mars.yml b/mars-start/mars-start-base/src/main/resources/demo/mars.yml index 3bb3d6a..3469f36 100644 --- a/mars-start/mars-start-base/src/main/resources/demo/mars.yml +++ b/mars-start/mars-start-base/src/main/resources/demo/mars.yml @@ -12,7 +12,7 @@ timeOut: maxContentLength: 10 #配置跨域请求 cross_domain: - origin: * + origin: "*" methods: "GET,POST" maxAge: 9 headers: "x-requested-with,Cache-Control,Pragma,Content-Type,Token" diff --git a/mars-start/mars-start-mj/src/main/java/com/mars/start/StartMars.java b/mars-start/mars-start-mj/src/main/java/com/mars/start/StartMars.java index 13cbca8..1963e49 100644 --- a/mars-start/mars-start-mj/src/main/java/com/mars/start/StartMars.java +++ b/mars-start/mars-start-mj/src/main/java/com/mars/start/StartMars.java @@ -15,7 +15,7 @@ public class StartMars { */ public static void start(Class clazz,String[] args){ if(args != null && args[0] != null){ - BaseStartMars.start(clazz,new InitJdbc(),args[0]); + BaseStartMars.start(clazz,new InitJdbc(),args[0],null); } else { start(clazz); } @@ -26,6 +26,6 @@ public class StartMars { * @param clazz */ public static void start(Class clazz){ - BaseStartMars.start(clazz,new InitJdbc(),null); + BaseStartMars.start(clazz,new InitJdbc(),null,null); } } diff --git a/mars-start/mars-start-mybatis/src/main/java/com/mars/start/StartMars.java b/mars-start/mars-start-mybatis/src/main/java/com/mars/start/StartMars.java index aeb18e4..9f826bd 100644 --- a/mars-start/mars-start-mybatis/src/main/java/com/mars/start/StartMars.java +++ b/mars-start/mars-start-mybatis/src/main/java/com/mars/start/StartMars.java @@ -15,7 +15,7 @@ public class StartMars { */ public static void start(Class clazz,String[] args) { if(args != null && args[0] != null){ - BaseStartMars.start(clazz,new InitJdbc(),args[0]); + BaseStartMars.start(clazz,new InitJdbc(),args[0],null); } else { start(clazz); } @@ -26,6 +26,6 @@ public class StartMars { * @param clazz */ public static void start(Class clazz) { - BaseStartMars.start(clazz,new InitJdbc(),null); + BaseStartMars.start(clazz,new InitJdbc(),null,null); } } diff --git a/mars-start/mars-start-simple/src/main/java/com/mars/start/StartMars.java b/mars-start/mars-start-simple/src/main/java/com/mars/start/StartMars.java index 091e9a7..da94b29 100644 --- a/mars-start/mars-start-simple/src/main/java/com/mars/start/StartMars.java +++ b/mars-start/mars-start-simple/src/main/java/com/mars/start/StartMars.java @@ -14,7 +14,7 @@ public class StartMars { */ public static void start(Class clazz,String[] args) { if(args != null && args[0] != null){ - BaseStartMars.start(clazz,null,args[0]); + BaseStartMars.start(clazz,null,args[0],null); } else { start(clazz); } @@ -25,6 +25,6 @@ public class StartMars { * @param clazz */ public static void start(Class clazz) { - BaseStartMars.start(clazz,null,null); + BaseStartMars.start(clazz,null,null,null); } } diff --git a/mars-timer/pom.xml b/mars-timer/pom.xml new file mode 100644 index 0000000..a6cc406 --- /dev/null +++ b/mars-timer/pom.xml @@ -0,0 +1,26 @@ + + + + Mars-java + com.github.yuyenews + 2.1.3 + + 4.0.0 + + mars-timer + + + + com.github.yuyenews + mars-core + true + + + com.github.yuyenews + mars-ioc + true + + + \ No newline at end of file diff --git a/mars-timer/src/main/java/com/mars/timer/execute/ExecuteMarsTimer.java b/mars-timer/src/main/java/com/mars/timer/execute/ExecuteMarsTimer.java new file mode 100644 index 0000000..07e6a5d --- /dev/null +++ b/mars-timer/src/main/java/com/mars/timer/execute/ExecuteMarsTimer.java @@ -0,0 +1,57 @@ +package com.mars.timer.execute; + +import com.mars.core.constant.MarsConstant; +import com.mars.core.constant.MarsSpace; +import com.mars.core.load.LoadHelper; +import com.mars.core.logger.MarsLogger; +import com.mars.core.model.MarsTimerModel; + +import java.lang.reflect.Method; +import java.util.Date; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + +/** + * 执行定时任务 + */ +public class ExecuteMarsTimer { + + private static MarsLogger marsLogger = MarsLogger.getLogger(ExecuteMarsTimer.class); + + /** + * 获取全局存储空间 + */ + private static MarsSpace constants = MarsSpace.getEasySpace(); + + /** + * 执行 + */ + public static void execute() { + try { + List marsTimerModelList = LoadHelper.getMarsTimersList(); + Date nowDate = new Date(); + for(MarsTimerModel marsTimerModel : marsTimerModelList){ + int loop = marsTimerModel.getMarsTimer().loop(); + /* 开启定时任务 */ + new Timer(marsTimerModel.getMethodName()).scheduleAtFixedRate(new TimerTask() { + @Override + public void run() { + try { + Object hasNettyStart = constants.getAttr(MarsConstant.HAS_NETTY_START); + if(hasNettyStart != null){ + Object beanObject = marsTimerModel.getObj(); + Method method = marsTimerModel.getMethod(); + method.invoke(beanObject); + } + } catch (Exception e){ + marsLogger.error("执行定时任务出错,方法名:"+marsTimerModel.getCls().getName()+"."+marsTimerModel.getMethod().getName(),e); + } + } + }, nowDate,loop); + } + } catch (Exception e){ + marsLogger.error("加载定时任务出错",e); + } + } +} diff --git a/mars-timer/src/main/java/com/mars/timer/load/LoadMarsTimer.java b/mars-timer/src/main/java/com/mars/timer/load/LoadMarsTimer.java new file mode 100644 index 0000000..f351454 --- /dev/null +++ b/mars-timer/src/main/java/com/mars/timer/load/LoadMarsTimer.java @@ -0,0 +1,69 @@ +package com.mars.timer.load; + +import com.mars.core.annotation.MarsTimer; +import com.mars.core.constant.MarsConstant; +import com.mars.core.constant.MarsSpace; +import com.mars.core.model.MarsTimerModel; +import com.mars.core.load.LoadHelper; +import com.mars.ioc.factory.BeanFactory; + +import java.lang.reflect.Method; +import java.util.List; +import java.util.Map; + +/** + * 加载所有加了MarsTimer注解的bean + */ +public class LoadMarsTimer { + + /** + * 获取全局存储空间 + */ + private static MarsSpace constants = MarsSpace.getEasySpace(); + + /** + * 加载所有加了MarsTimer注解的对象 + * @throws Exception + */ + public static void loadMarsTimers() throws Exception { + /* 获取所有的bean数据 */ + List> marsBeansList = LoadHelper.getBeanList(); + + List marsTimerObjects = LoadHelper.getMarsTimersList(); + + for(Map map : marsBeansList) { + + Class cls = (Class)map.get("className"); + String beanName = LoadHelper.getBeanName(map,cls); + loadMethods(cls,marsTimerObjects,beanName); + } + } + + /** + * 加载加了MarsTimer注解的方法,并保存 + * @param cls + * @param marsTimerObjects + */ + private static void loadMethods(Class cls, List marsTimerObjects,String beanName) throws Exception { + Method[] methods = cls.getDeclaredMethods(); + for(Method method : methods){ + MarsTimer marsTimer = method.getAnnotation(MarsTimer.class); + if(marsTimer != null){ + if(method.getParameterCount() > 0){ + throw new Exception("有参数的方法不可以添加定时任务,方法名:"+cls.getName()+"."+ method.getName()); + } + Object beanObject = BeanFactory.getBean(beanName,cls); + + MarsTimerModel marsTimerModel = new MarsTimerModel(); + marsTimerModel.setCls(cls); + marsTimerModel.setMethodName(method.getName()); + marsTimerModel.setObj(beanObject); + marsTimerModel.setMethod(method); + marsTimerModel.setMarsTimer(marsTimer); + marsTimerObjects.add(marsTimerModel); + } + } + /* 保险起见,重新插入数据 */ + constants.setAttr(MarsConstant.MARS_TIMER_OBJECTS, marsTimerObjects); + } +} diff --git a/pom.xml b/pom.xml index 42541fd..9c7055a 100644 --- a/pom.xml +++ b/pom.xml @@ -16,7 +16,8 @@ mars-start mars-jdbc mars-junit - + mars-timer + ${java.home}/../bin/javadoc @@ -60,6 +61,11 @@ mars-junit ${project.parent.version} + + com.github.yuyenews + mars-timer + ${project.parent.version} + io.netty @@ -123,11 +129,11 @@ druid 1.1.10 - + - com.github.pagehelper - pagehelper - 4.1.3 + com.github.pagehelper + pagehelper + 4.1.3