Просмотр исходного кода

事件侦听改为注解方式,方便后期开发,取消配置文件方式

wuxw7 лет назад: 7
Родитель
Сommit
fec26dfca0
22 измененных файлов с 631 добавлено и 39 удалено
  1. 5 1
      CenterService/src/main/java/com/java110/center/CenterServiceApplicationStart.java
  2. 5 3
      java110-event/src/main/java/com/java110/event/center/listener/DealUserIdListener.java
  3. 33 0
      CenterService/src/main/java/com/java110/center/listener/ReceiveRequestListener.java
  4. 8 5
      CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
  5. 5 1
      StoreService/src/main/java/com/java110/store/StoreServiceApplicationStart.java
  6. 216 0
      StoreService/src/main/java/com/java110/store/listener/SaveStoreInfoListener.java
  7. 6 1
      UserService/src/main/java/com/java110/user/UserServiceApplicationStart.java
  8. 2 1
      UserService/src/main/java/com/java110/user/listener/SaveUserAddressListener.java
  9. 2 1
      UserService/src/main/java/com/java110/user/listener/SaveUserCredentialsListener.java
  10. 2 1
      UserService/src/main/java/com/java110/user/listener/SaveUserInfoListener.java
  11. 2 1
      UserService/src/main/java/com/java110/user/listener/SaveUserTagListener.java
  12. 5 0
      java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java
  13. 21 0
      java110-core/src/main/java/com/java110/core/annotation/Java110Listener.java
  14. 23 0
      java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscovery.java
  15. 197 0
      java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscoveryRegistrar.java
  16. 62 9
      java110-event/src/main/java/com/java110/event/center/DataFlowEventPublishing.java
  17. 18 1
      java110-event/src/main/java/com/java110/event/center/event/DataResponseEvent.java
  18. 8 0
      java110-event/src/main/java/com/java110/event/center/event/ReceiveRequestEvent.java
  19. 1 8
      java110-event/src/main/java/com/java110/event/center/init/EventConfigInit.java
  20. 2 0
      java110-event/src/main/java/com/java110/event/center/listener/DataFlowListener.java
  21. 6 4
      java110-event/src/main/java/com/java110/event/service/BusinessServiceDataFlowEventPublishing.java
  22. 2 2
      java110-event/src/main/java/com/java110/event/service/init/SystemStartLoadBusinessConfigure.java

+ 5 - 1
CenterService/src/main/java/com/java110/center/CenterServiceApplicationStart.java

@@ -2,6 +2,8 @@ package com.java110.center;
 
 import com.java110.center.smo.ICenterServiceCacheSMO;
 import com.java110.common.factory.ApplicationContextFactory;
+import com.java110.core.annotation.Java110ListenerDiscovery;
+import com.java110.event.center.DataFlowEventPublishing;
 import com.java110.event.center.init.EventConfigInit;
 import com.java110.service.init.ServiceStartInit;
 import org.springframework.boot.SpringApplication;
@@ -29,6 +31,8 @@ import java.nio.charset.Charset;
 @SpringBootApplication(scanBasePackages={"com.java110.service","com.java110.center","com.java110.core","com.java110.event.center","com.java110.cache"})
 @EnableDiscoveryClient
 //@EnableConfigurationProperties(EventProperties.class)
+@Java110ListenerDiscovery(listenerPublishClass = DataFlowEventPublishing.class,
+        basePackages = {"com.java110.center.listener"})
 public class CenterServiceApplicationStart {
 
     /**
@@ -61,7 +65,7 @@ public class CenterServiceApplicationStart {
         ServiceStartInit.initSystemConfig(context);
 
         //加载事件数据
-        EventConfigInit.initSystemConfig();
+        //EventConfigInit.initSystemConfig();
 
         //刷新缓存
         flushMainCache(args);

+ 5 - 3
java110-event/src/main/java/com/java110/event/center/listener/DealUserIdListener.java

@@ -1,19 +1,21 @@
-package com.java110.event.center.listener;
+package com.java110.center.listener;
 
 import com.java110.common.constant.ResponseConstant;
 import com.java110.common.exception.ListenerExecuteException;
+import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlow;
 import com.java110.event.app.order.Ordered;
 import com.java110.event.center.event.InvokeBusinessSystemEvent;
+import com.java110.event.center.listener.DataFlowListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.stereotype.Component;
 
 /**
  * 用户ID处理 侦听
  * Created by wuxw on 2018/7/2.
  */
-@Component
+//@Component
+@Java110Listener(name="dealUserIdListener")
 public class DealUserIdListener implements DataFlowListener<InvokeBusinessSystemEvent>,Ordered {
 
     private final static Logger logger = LoggerFactory.getLogger(DealUserIdListener.class);

+ 33 - 0
CenterService/src/main/java/com/java110/center/listener/ReceiveRequestListener.java

@@ -0,0 +1,33 @@
+package com.java110.center.listener;
+
+import com.java110.core.annotation.Java110Listener;
+import com.java110.event.app.order.Ordered;
+import com.java110.event.center.event.ReceiveRequestEvent;
+import com.java110.event.center.listener.DataFlowListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Map;
+
+/**
+ * Created by wuxw on 2018/7/2.
+ */
+@Java110Listener(name = "receiveRequestListener")
+public class ReceiveRequestListener implements DataFlowListener<ReceiveRequestEvent>,Ordered {
+
+    private final static Logger logger = LoggerFactory.getLogger(ReceiveRequestListener.class);
+
+    @Override
+    public int getOrder() {
+        return 1;
+    }
+
+    @Override
+    public void soService(ReceiveRequestEvent event) {
+
+        Map<String,String> headers = event.getHeaders();
+        logger.debug("请求头信息为:{}",headers);
+        String requestData = event.getRequestData();
+        logger.debug("请求报文为:{}",requestData);
+    }
+}

+ 8 - 5
CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java

@@ -70,19 +70,23 @@ public class CenterServiceSMOImpl extends LoggerEngine implements ICenterService
             DataFlowEventPublishing.preValidateData(reqJson,headers);
             //1.0 创建数据流
             dataFlow = DataFlowFactory.newInstance(DataFlow.class).builder(reqJson, headers);
+            DataFlowEventPublishing.initDataFlowComplete(dataFlow);
 
-            /*LogAgent.sendLog(dataFlow.reBuilder(dataFlow.getTransactionId(),LogAgent.LOG_TYPE_S,LogAgent.LOG_STATUS_S,
-                    dataFlow.getRequestURL(),dataFlow.getReqData(),dataFlow.getHeaders()));
-*/
             //2.0 加载配置信息
             initConfigData(dataFlow);
+            DataFlowEventPublishing.loadConfigDataComplete(dataFlow);
+
             //3.0 校验 APPID是否有权限操作serviceCode
             judgeAuthority(dataFlow);
             //4.0 调用规则校验
             ruleValidate(dataFlow);
+            DataFlowEventPublishing.ruleValidateComplete(dataFlow);
+
             //5.0 保存订单和业务项 c_orders c_order_attrs c_business c_business_attrs
             saveOrdersAndBusiness(dataFlow);
+
             //6.0 调用下游系统
+            DataFlowEventPublishing.invokeBusinessSystem(dataFlow);
             invokeBusinessSystem(dataFlow);
 
             responseJson = DataTransactionFactory.createCommonResponseJson(dataFlow);
@@ -144,11 +148,10 @@ public class CenterServiceSMOImpl extends LoggerEngine implements ICenterService
                 AuthenticationFactory.putSign(dataFlow, responseJson);
                 saveLogMessage(dataFlow,LogAgent.createLogMessage(dataFlow.getRequestHeaders(),dataFlow.getReqJson().toJSONString()),
                         LogAgent.createLogMessage(dataFlow.getResponseHeaders(),dataFlow.getResJson().toJSONString()),endDate.getTime()-dataFlow.getStartDate().getTime());
-
+                DataFlowEventPublishing.dataResponse(dataFlow,reqJson,headers);
             }
             resJson = encrypt(responseJson.toJSONString(),headers);
             //这里保存耗时,以及日志
-
             return resJson;
 
         }

+ 5 - 1
StoreService/src/main/java/com/java110/store/StoreServiceApplicationStart.java

@@ -1,5 +1,7 @@
 package com.java110.store;
 
+import com.java110.core.annotation.Java110ListenerDiscovery;
+import com.java110.event.service.BusinessServiceDataFlowEventPublishing;
 import com.java110.event.service.init.SystemStartLoadBusinessConfigure;
 import com.java110.service.init.ServiceStartInit;
 import org.springframework.boot.SpringApplication;
@@ -26,6 +28,8 @@ import java.nio.charset.Charset;
  */
 @SpringBootApplication(scanBasePackages={"com.java110.service","com.java110.store","com.java110.core","com.java110.cache"})
 @EnableDiscoveryClient
+@Java110ListenerDiscovery(listenerPublishClass = BusinessServiceDataFlowEventPublishing.class,
+        basePackages = {"com.java110.store.listener"})
 public class StoreServiceApplicationStart {
 
     private final static String LISTENER_PATH = "java110.StoreService.listeners";
@@ -46,6 +50,6 @@ public class StoreServiceApplicationStart {
         ApplicationContext context = SpringApplication.run(StoreServiceApplicationStart.class, args);
         ServiceStartInit.initSystemConfig(context);
         //加载业务侦听
-        SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
+        //SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
     }
 }

+ 216 - 0
StoreService/src/main/java/com/java110/store/listener/SaveStoreInfoListener.java

@@ -0,0 +1,216 @@
+package com.java110.store.listener;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.ServiceCodeConstant;
+import com.java110.common.constant.StatusConstant;
+import com.java110.common.log.LoggerEngine;
+import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.DataTransactionFactory;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.entity.center.Business;
+import com.java110.event.service.BusinessServiceDataFlowEvent;
+import com.java110.event.service.BusinessServiceDataFlowListener;
+import com.java110.store.dao.IStoreServiceDao;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 保存 用户信息 侦听
+ * Created by wuxw on 2018/5/18.
+ */
+@Java110Listener("saveStoreInfoListener")
+@Transactional
+public class SaveStoreInfoListener extends LoggerEngine implements BusinessServiceDataFlowListener{
+
+    @Autowired
+    IStoreServiceDao storeServiceDaoImpl;
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_SAVE_STORE_INFO;
+    }
+
+    @Override
+    public void soService(BusinessServiceDataFlowEvent event) {
+        //这里处理业务逻辑数据
+        DataFlowContext dataFlowContext = event.getDataFlowContext();
+        doSaveUserInfo(dataFlowContext);
+    }
+
+    private void doSaveUserInfo(DataFlowContext dataFlowContext){
+        String businessType = dataFlowContext.getOrder().getBusinessType();
+        Business business = dataFlowContext.getCurrentBusiness();
+        //Assert.hasLength(business.getbId(),"bId 不能为空");
+        // Instance 过程
+        if(StatusConstant.REQUEST_BUSINESS_TYPE_INSTANCE.equals(businessType)){
+            //doComplateUserInfo(business);
+            doSaveInstanceUserInfo(dataFlowContext,business);
+        }else if(StatusConstant.REQUEST_BUSINESS_TYPE_BUSINESS.equals(businessType)){ // Business过程
+            doSaveBusinessUserInfo(dataFlowContext,business);
+        }else if(StatusConstant.REQUEST_BUSINESS_TYPE_DELETE.equals(businessType)){ //撤单过程
+            doDeleteInstanceUserInfo(dataFlowContext,business);
+        }
+
+        dataFlowContext.setResJson(DataTransactionFactory.createBusinessResponseJson(dataFlowContext,ResponseConstant.RESULT_CODE_SUCCESS,"成功",
+                dataFlowContext.getParamOut()));
+    }
+
+    /**
+     * 撤单
+     * @param business
+     */
+    private void doDeleteInstanceUserInfo(DataFlowContext dataFlowContext,Business business) {
+
+        /*String bId = business.getbId();
+        //Assert.hasLength(bId,"请求报文中没有包含 bId");
+        Map info = new HashMap();
+        info.put("bId",bId);
+        Map userInfo = storeServiceDaoImpl.queryUserInfo(info);
+        if(userInfo != null && !userInfo.isEmpty()){
+            info.put("bId",bId);
+            info.put("userId",userInfo.get("user_id").toString());
+            info.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+            storeServiceDaoImpl.updateUserInfoInstance(userInfo);
+            dataFlowContext.addParamOut("userId",userInfo.get("user_id"));
+        }
+
+        info.clear();
+        info.put("bId",bId);
+
+        List<Map> userAttrs = storeServiceDaoImpl.queryUserInfoAttrs(info);
+
+        if(userAttrs != null && userAttrs.size() >0){
+            info.put("bId",bId);
+            //info.put("userId",userInfo.get("user_id").toString());
+            info.put("statusCd",StatusConstant.STATUS_CD_INVALID);
+            storeServiceDaoImpl.updateUserAttrInstance(info);
+        }
+*/
+
+    }
+
+    /**
+     * instance过程
+     * @param business
+     */
+    private void doSaveInstanceUserInfo(DataFlowContext dataFlowContext,Business business) {
+
+        JSONObject data = business.getDatas();
+
+        //Assert.notEmpty(data,"没有datas 节点,或没有子节点需要处理");
+
+        //Assert.jsonObjectHaveKey(data,"businessUser","datas 节点下没有包含 businessUser 节点");
+
+        //JSONObject businessUser = data.getJSONObject("businessUser");
+       /* Map info = new HashMap();
+        info.put("bId",business.getbId());
+        info.put("operate",StatusConstant.OPERATE_ADD);
+        Map businessUser = storeServiceDaoImpl.queryBusinessUserInfo(info);
+        if( businessUser != null && !businessUser.isEmpty()) {
+            storeServiceDaoImpl.saveUserInfoInstance(businessUser);
+            dataFlowContext.addParamOut("userId",businessUser.get("user_id"));
+        }
+        List<Map> businessUserAttrs = storeServiceDaoImpl.queryBusinessUserInfoAttrs(info);
+        if(businessUserAttrs != null && businessUserAttrs.size() > 0) {
+            storeServiceDaoImpl.saveUserAttrInstance(businessUser);
+        }*/
+
+
+    }
+
+    /**
+     * 保存数据至u_user 表中
+     * @param business
+     */
+    private void doComplateUserInfo(DataFlowContext dataFlowContext,Business business) {
+        /*String bId = business.getbId();
+        Map paramIn = new HashMap();
+        paramIn.put("bId",bId);
+        paramIn.put("statusCd",StatusConstant.STATUS_CD_VALID);
+        storeServiceDaoImpl.updateUserInfoInstance(paramIn);
+        storeServiceDaoImpl.updateUserAttrInstance(paramIn);*/
+    }
+
+    /**
+     * 处理用户信息
+     * @param business
+     */
+    private void doSaveBusinessUserInfo(DataFlowContext dataFlowContext,Business business) {
+
+        /*JSONObject data = business.getDatas();
+
+        Assert.notEmpty(data,"没有datas 节点,或没有子节点需要处理");
+
+        Assert.jsonObjectHaveKey(data,"businessUser","datas 节点下没有包含 businessUser 节点");
+
+        JSONObject businessUser = data.getJSONObject("businessUser");
+
+        Assert.jsonObjectHaveKey(businessUser,"userId","businessUser 节点下没有包含 userId 节点");
+
+        if(businessUser.getInteger("userId") < 0){
+            //生成userId
+            String userId = GenerateCodeFactory.getUserId();
+            businessUser.put("userId",userId);
+        }
+        dataFlowContext.addParamOut("userId",businessUser.getString("userId"));
+        businessUser.put("bId",business.getbId());
+        businessUser.put("operate", StatusConstant.OPERATE_ADD);
+        //保存用户信息
+        storeServiceDaoImpl.saveBusinessUserInfo(businessUser);
+
+        if(businessUser.containsKey("businessUserAttr")){
+            doSaveUserAttrs(business);
+        }*/
+
+        //storeServiceDaoImpl.saveUserInfoInstance(businessUser);
+
+
+
+    }
+
+    private void doSaveUserAttrs(Business business){
+        /*JSONObject data = business.getDatas();
+        JSONObject businessUser = data.getJSONObject("businessUser");
+        JSONArray businessUserAttrs = businessUser.getJSONArray("businessUserAttr");
+        for(int userAttrIndex = 0 ; userAttrIndex < businessUserAttrs.size();userAttrIndex ++){
+            JSONObject userAttr = businessUserAttrs.getJSONObject(userAttrIndex);
+            Assert.jsonObjectHaveKey(userAttr,"attrId","businessUserAttr 节点下没有包含 attrId 节点");
+
+            if(userAttr.getInteger("attrId") < 0){
+                String attrId = GenerateCodeFactory.getAttrId();
+                userAttr.put("attrId",attrId);
+            }
+
+            userAttr.put("bId",business.getbId());
+            userAttr.put("userId",businessUser.getString("userId"));
+            userAttr.put("operate", StatusConstant.OPERATE_ADD);
+
+            storeServiceDaoImpl.saveBusinessUserAttr(userAttr);
+        }*/
+
+        /*JSONObject attrInstance = new JSONObject();
+        attrInstance.put("bId",business.getbId());
+        storeServiceDaoImpl.saveUserAttrInstance(attrInstance);*/
+    }
+
+    public IStoreServiceDao getStoreServiceDaoImpl() {
+        return storeServiceDaoImpl;
+    }
+
+    public void setStoreServiceDaoImpl(IStoreServiceDao storeServiceDaoImpl) {
+        this.storeServiceDaoImpl = storeServiceDaoImpl;
+    }
+}

+ 6 - 1
UserService/src/main/java/com/java110/user/UserServiceApplicationStart.java

@@ -1,5 +1,8 @@
 package com.java110.user;
 
+import com.java110.core.annotation.Java110ListenerDiscovery;
+import com.java110.event.center.DataFlowEventPublishing;
+import com.java110.event.service.BusinessServiceDataFlowEventPublishing;
 import com.java110.event.service.init.SystemStartLoadBusinessConfigure;
 import com.java110.service.init.ServiceStartInit;
 import org.apache.catalina.Context;
@@ -32,6 +35,8 @@ import java.nio.charset.Charset;
  */
 @SpringBootApplication(scanBasePackages={"com.java110.service","com.java110.user","com.java110.core","com.java110.cache"})
 @EnableDiscoveryClient
+@Java110ListenerDiscovery(listenerPublishClass = BusinessServiceDataFlowEventPublishing.class,
+        basePackages = {"com.java110.user.listener"})
 public class UserServiceApplicationStart {
 
     private final static String LISTENER_PATH = "java110.UserService.listeners";
@@ -52,6 +57,6 @@ public class UserServiceApplicationStart {
         ApplicationContext context = SpringApplication.run(UserServiceApplicationStart.class, args);
         ServiceStartInit.initSystemConfig(context);
         //加载业务侦听
-        SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
+       // SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
     }
 }

+ 2 - 1
UserService/src/main/java/com/java110/user/listener/SaveUserAddressListener.java

@@ -8,6 +8,7 @@ import com.java110.common.constant.StatusConstant;
 import com.java110.common.exception.ListenerExecuteException;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.DataTransactionFactory;
 import com.java110.core.factory.GenerateCodeFactory;
@@ -29,7 +30,7 @@ import java.util.Map;
  * 保存 用户信息 侦听
  * Created by wuxw on 2018/5/18.
  */
-@Service("saveUserAddress")
+@Java110Listener(name = "saveUserAddressListener")
 @Transactional
 public class SaveUserAddressListener implements BusinessServiceDataFlowListener{
 

+ 2 - 1
UserService/src/main/java/com/java110/user/listener/SaveUserCredentialsListener.java

@@ -7,6 +7,7 @@ import com.java110.common.constant.StatusConstant;
 import com.java110.common.exception.ListenerExecuteException;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.DataTransactionFactory;
 import com.java110.entity.center.Business;
@@ -26,7 +27,7 @@ import java.util.Map;
  * 保存 用户信息 侦听
  * Created by wuxw on 2018/5/18.
  */
-@Service("saveUserCredentials")
+@Java110Listener("saveUserCredentialsListener")
 @Transactional
 public class SaveUserCredentialsListener extends LoggerEngine implements BusinessServiceDataFlowListener{
 

+ 2 - 1
UserService/src/main/java/com/java110/user/listener/SaveUserInfoListener.java

@@ -7,6 +7,7 @@ import com.java110.common.constant.ServiceCodeConstant;
 import com.java110.common.constant.StatusConstant;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
 import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.DataTransactionFactory;
@@ -26,7 +27,7 @@ import java.util.Map;
  * 保存 用户信息 侦听
  * Created by wuxw on 2018/5/18.
  */
-@Service("saveUserInfo")
+@Java110Listener("saveUserInfoListener")
 @Transactional
 public class SaveUserInfoListener extends LoggerEngine implements BusinessServiceDataFlowListener{
 

+ 2 - 1
UserService/src/main/java/com/java110/user/listener/SaveUserTagListener.java

@@ -8,6 +8,7 @@ import com.java110.common.constant.StatusConstant;
 import com.java110.common.exception.ListenerExecuteException;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
+import com.java110.core.annotation.Java110Listener;
 import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.DataTransactionFactory;
 import com.java110.core.factory.GenerateCodeFactory;
@@ -29,7 +30,7 @@ import java.util.Map;
  * 保存 用户信息 侦听
  * Created by wuxw on 2018/5/18.
  */
-@Service("saveUserTag")
+@Java110Listener("saveUserTagListener")
 @Transactional
 public class SaveUserTagListener extends LoggerEngine implements BusinessServiceDataFlowListener{
 

+ 5 - 0
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java

@@ -85,6 +85,11 @@ public class ServiceCodeConstant {
      */
     public static final String SERVICE_CODE_SAVE_USER_CREDENTIALS = "save.user.credentials";
 
+    /**
+     * 保存商户信息
+     */
+    public static final String SERVICE_CODE_SAVE_STORE_INFO = "save.store.info";
+
 
 
 

+ 21 - 0
java110-core/src/main/java/com/java110/core/annotation/Java110Listener.java

@@ -0,0 +1,21 @@
+package com.java110.core.annotation;
+
+import org.springframework.core.annotation.AliasFor;
+import org.springframework.stereotype.Component;
+
+import java.lang.annotation.*;
+
+/**
+ * Created by wuxw on 2018/7/2.
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Component
+public @interface Java110Listener {
+    @AliasFor("name")
+    String value() default "";
+
+    @AliasFor("value")
+    String name() default "";
+}

+ 23 - 0
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscovery.java

@@ -0,0 +1,23 @@
+package com.java110.core.annotation;
+
+import org.springframework.context.annotation.Import;
+
+import java.lang.annotation.*;
+
+/**
+ * 侦听注入
+ * Created by wuxw on 2018/7/2.
+ */
+@Target(ElementType.TYPE)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+@Import(Java110ListenerDiscoveryRegistrar.class)
+public @interface Java110ListenerDiscovery {
+
+    String[] basePackages() default {};
+
+    String[] value() default {};
+
+    Class<?> listenerPublishClass();
+}

+ 197 - 0
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscoveryRegistrar.java

@@ -0,0 +1,197 @@
+package com.java110.core.annotation;
+
+import com.java110.common.util.Assert;
+import org.springframework.beans.factory.BeanClassLoaderAware;
+import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
+import org.springframework.beans.factory.config.BeanDefinition;
+import org.springframework.beans.factory.config.BeanDefinitionHolder;
+import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
+import org.springframework.beans.factory.support.BeanDefinitionRegistry;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
+import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.type.AnnotationMetadata;
+import org.springframework.core.type.filter.AnnotationTypeFilter;
+import org.springframework.util.ClassUtils;
+import org.springframework.util.StringUtils;
+
+import java.beans.Introspector;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 自定义侦听扫描
+ * Created by wuxw on 2018/7/2.
+ */
+public class Java110ListenerDiscoveryRegistrar implements ImportBeanDefinitionRegistrar,ResourceLoaderAware, BeanClassLoaderAware {
+
+    private ResourceLoader resourceLoader;
+
+    private ClassLoader classLoader;
+
+    public Java110ListenerDiscoveryRegistrar(){
+
+    }
+
+    @Override
+    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
+        try {
+            registerListener(importingClassMetadata,registry);
+        } catch (NoSuchMethodException e) {
+            e.printStackTrace();
+        } catch (InvocationTargetException e) {
+            e.printStackTrace();
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void setBeanClassLoader(ClassLoader classLoader) {
+        this.classLoader = classLoader;
+    }
+
+    @Override
+    public void setResourceLoader(ResourceLoader resourceLoader) {
+        this.resourceLoader = resourceLoader;
+    }
+
+    /**
+     * 注册侦听
+     * @param metadata
+     * @param registry
+     */
+    public void registerListener(AnnotationMetadata metadata,
+                                 BeanDefinitionRegistry registry) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
+        ClassPathScanningCandidateComponentProvider scanner = getScanner();
+        scanner.setResourceLoader(this.resourceLoader);
+        Set<String> basePackages;
+        Map<String, Object> attrs = metadata
+                .getAnnotationAttributes(Java110ListenerDiscovery.class.getName());
+
+        Object listenerPublishClassObj =  attrs.get("listenerPublishClass");
+
+        Assert.notNull(listenerPublishClassObj,"Java110ListenerDiscovery 没有配置 listenerPublishClass 属性");
+
+        Class<?> listenerPublishClass = (Class<?>) listenerPublishClassObj;
+
+        AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(
+                Java110Listener.class);
+
+        scanner.addIncludeFilter(annotationTypeFilter);
+        basePackages = getBasePackages(metadata);
+
+        for (String basePackage : basePackages) {
+            Set<BeanDefinition> candidateComponents = scanner
+                    .findCandidateComponents(basePackage);
+            for (BeanDefinition candidateComponent : candidateComponents) {
+                if (candidateComponent instanceof AnnotatedBeanDefinition) {
+                    // verify annotated class is an interface
+                    AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
+                    AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
+
+
+                    Map<String, Object> attributes = annotationMetadata
+                            .getAnnotationAttributes(
+                                    Java110Listener.class.getCanonicalName());
+
+                    String beanName = getListenerName(attributes,beanDefinition);
+
+                    /*BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(beanDefinition, beanName);
+                    BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, registry);*/
+                    Method method = listenerPublishClass.getMethod("addListener",String.class);
+                    method.invoke(null,beanName);
+                }
+            }
+        }
+    }
+
+    protected ClassPathScanningCandidateComponentProvider getScanner() {
+        return new ClassPathScanningCandidateComponentProvider(false) {
+
+            @Override
+            protected boolean isCandidateComponent(
+                    AnnotatedBeanDefinition beanDefinition) {
+                if (beanDefinition.getMetadata().isIndependent()) {
+                    // TODO until SPR-11711 will be resolved
+                    if (beanDefinition.getMetadata().isInterface()
+                            && beanDefinition.getMetadata()
+                            .getInterfaceNames().length == 1
+                            && Annotation.class.getName().equals(beanDefinition
+                            .getMetadata().getInterfaceNames()[0])) {
+                        try {
+                            Class<?> target = ClassUtils.forName(
+                                    beanDefinition.getMetadata().getClassName(),
+                                    Java110ListenerDiscoveryRegistrar.this.classLoader);
+                            return !target.isAnnotation();
+                        }
+                        catch (Exception ex) {
+                            this.logger.error(
+                                    "Could not load target class: "
+                                            + beanDefinition.getMetadata().getClassName(),
+                                    ex);
+
+                        }
+                    }
+                    return true;
+                }
+                return false;
+
+            }
+        };
+    }
+
+    protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata) {
+        Map<String, Object> attributes = importingClassMetadata
+                .getAnnotationAttributes(Java110ListenerDiscovery.class.getCanonicalName());
+
+        Set<String> basePackages = new HashSet<String>();
+        for (String pkg : (String[]) attributes.get("value")) {
+            if (StringUtils.hasText(pkg)) {
+                basePackages.add(pkg);
+            }
+        }
+        for (String pkg : (String[]) attributes.get("basePackages")) {
+            if (StringUtils.hasText(pkg)) {
+                basePackages.add(pkg);
+            }
+        }
+        if (basePackages.isEmpty()) {
+            basePackages.add(
+                    ClassUtils.getPackageName(importingClassMetadata.getClassName()));
+        }
+        return basePackages;
+    }
+
+
+    /**
+     * 获取名称
+     * @param listeners
+     * @param beanDefinition
+     * @return
+     */
+    private String getListenerName(Map<String, Object> listeners,AnnotatedBeanDefinition beanDefinition) {
+        if (listeners == null) {
+            String shortClassName = ClassUtils.getShortName(beanDefinition.getBeanClassName());
+            return Introspector.decapitalize(shortClassName);
+        }
+        String value = (String) listeners.get("value");
+        if (!StringUtils.hasText(value)) {
+            value = (String) listeners.get("name");
+        }
+        if (StringUtils.hasText(value)) {
+            return value;
+        }
+
+        String shortClassName = ClassUtils.getShortName(beanDefinition.getBeanClassName());
+        value = Introspector.decapitalize(shortClassName);
+        return value;
+    }
+
+
+}

+ 62 - 9
java110-event/src/main/java/com/java110/event/center/DataFlowEventPublishing.java

@@ -2,11 +2,11 @@ package com.java110.event.center;
 
 import com.java110.common.constant.CommonConstant;
 import com.java110.common.exception.BusinessException;
+import com.java110.common.factory.ApplicationContextFactory;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
-import com.java110.event.center.event.DataFlowEvent;
-import com.java110.event.center.event.DataPreValidateEvent;
-import com.java110.event.center.event.ReceiveRequestEvent;
+import com.java110.core.context.DataFlow;
+import com.java110.event.center.event.*;
 import com.java110.event.center.listener.DataFlowListener;
 
 import java.lang.reflect.ParameterizedType;
@@ -32,7 +32,7 @@ public class DataFlowEventPublishing extends LoggerEngine {
     /**
      * 保存侦听实例信息,一般启动时加载
      */
-    private final static List<DataFlowListener<?>> listeners = new ArrayList<DataFlowListener<?>>();
+    private final static List<String> listeners = new ArrayList<String>();
 
     /**
      * 保存事件实例信息,一般启动时加载
@@ -52,15 +52,25 @@ public class DataFlowEventPublishing extends LoggerEngine {
      * 添加 侦听,这个只有启动时,单线程 处理,所以是线程安全的
      * @param listener
      */
-    public static void addListener(DataFlowListener<?> listener){
+    /*public static void addListener(DataFlowListener<?> listener){
         listeners.add(listener);
+    }*/
+
+    /**
+     * 注解注册侦听
+     * @param listenerBeanName
+     */
+    public static void addListener(String listenerBeanName){
+        //将 listener 放入 AppEventPublishing 中方便后期操作
+        //注册侦听
+        listeners.add(listenerBeanName);
     }
 
     /**
      * 获取侦听(全部侦听)
      * @return
      */
-    private static List<DataFlowListener<?>> getListeners(){
+    private static List<String> getListeners(){
         return listeners;
     }
 
@@ -72,7 +82,7 @@ public class DataFlowEventPublishing extends LoggerEngine {
      */
     private static List<DataFlowListener<?>> getListeners(String interfaceClassName){
 
-        Assert.isNull(interfaceClassName,"获取需要发布的事件处理侦听时,传递事件为空,请检查");
+        Assert.hasLength(interfaceClassName,"获取需要发布的事件处理侦听时,传递事件为空,请检查");
 
         //先从缓存中获取,为了提升效率
         if(cacheListenersMap.containsKey(interfaceClassName)){
@@ -80,7 +90,9 @@ public class DataFlowEventPublishing extends LoggerEngine {
         }
 
         List<DataFlowListener<?>> dataFlowListeners = new ArrayList<DataFlowListener<?>>();
-        for(DataFlowListener<?> listener : getListeners()){
+
+        for(String listenerBeanName : getListeners()){
+            DataFlowListener<?> listener = ApplicationContextFactory.getBean(listenerBeanName,DataFlowListener.class);
             Type[] types =  listener.getClass().getGenericInterfaces();
             for (Type type : types) {
                 if (type instanceof ParameterizedType) {
@@ -141,7 +153,7 @@ public class DataFlowEventPublishing extends LoggerEngine {
      */
     private static void multicastEvent(final DataFlowEvent event, String asyn) {
 
-        for (final DataFlowListener<?> listener :  getListeners(event.getClass().getName())) {
+            for (final DataFlowListener<?> listener :  getListeners(event.getClass().getName())) {
 
             if(CommonConstant.PROCESS_ORDER_ASYNCHRONOUS.equals(asyn)){ //异步处理
 
@@ -206,5 +218,46 @@ public class DataFlowEventPublishing extends LoggerEngine {
         multicastEvent(new DataPreValidateEvent("",null,requestData,headers));
     }
 
+    /**
+     * 初始化 DataFlow 对象完成
+     * @param dataFlow 数据流对象
+     */
+    public static void initDataFlowComplete(DataFlow dataFlow){
+        multicastEvent(new DataFlowInitCompleteEvent("",dataFlow));
+    }
+
+    /**
+     * 规则校验完成事件
+     * @param dataFlow 数据流对象
+     */
+    public static void ruleValidateComplete(DataFlow dataFlow){
+        multicastEvent(new RuleValidateCompleteEvent("",dataFlow));
+    }
+
+    /**
+     * 加载配置文件完成
+     * @param dataFlow 数据流对象
+     */
+    public static void loadConfigDataComplete(DataFlow dataFlow){
+        multicastEvent(new LoadConfigDataCompleteEvent("",dataFlow));
+    }
+
+
+    /**
+     * 调用业务系统事件
+     * @param dataFlow 数据流
+     */
+    public static void invokeBusinessSystem(DataFlow dataFlow){
+        multicastEvent(new InvokeBusinessSystemEvent("",dataFlow));
+    }
+
+    /**
+     * 数据返回事件
+     * @param dataFlow 数据流
+     */
+    public static void dataResponse(DataFlow dataFlow,String responseData,Map<String,String> headers){
+        multicastEvent(new DataResponseEvent("",dataFlow,responseData,headers));
+    }
+
     /***********************************************发布侦听 结束***************************************************************/
 }

+ 18 - 1
java110-event/src/main/java/com/java110/event/center/event/DataResponseEvent.java

@@ -2,11 +2,18 @@ package com.java110.event.center.event;
 
 import com.java110.core.context.DataFlow;
 
+import java.util.Map;
+
 /**
  * 规则校验完成事件
  * Created by wuxw on 2018/7/2.
  */
 public class DataResponseEvent extends DataFlowEvent {
+
+
+    private final String responseData;
+
+    private final Map<String,String> headers;
     /**
      * Constructs a prototypical Event.
      *
@@ -14,7 +21,17 @@ public class DataResponseEvent extends DataFlowEvent {
      * @param dataFlow
      * @throws IllegalArgumentException if source is null.
      */
-    public DataResponseEvent(Object source, DataFlow dataFlow) {
+    public DataResponseEvent(Object source, DataFlow dataFlow,String responseData, Map<String,String> headers) {
         super(source, dataFlow);
+        this.responseData = responseData;
+        this.headers = headers;
+    }
+
+    public String getResponseData() {
+        return responseData;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
     }
 }

+ 8 - 0
java110-event/src/main/java/com/java110/event/center/event/ReceiveRequestEvent.java

@@ -25,4 +25,12 @@ public class ReceiveRequestEvent extends DataFlowEvent {
         this.requestData = requestData;
         this.headers = headers;
     }
+
+    public String getRequestData() {
+        return requestData;
+    }
+
+    public Map<String, String> getHeaders() {
+        return headers;
+    }
 }

+ 1 - 8
java110-event/src/main/java/com/java110/event/center/init/EventConfigInit.java

@@ -1,14 +1,11 @@
 package com.java110.event.center.init;
 
 import com.java110.common.factory.ApplicationContextFactory;
-import com.java110.event.app.AppEventPublishing;
 import com.java110.event.center.DataFlowEventPublishing;
 import com.java110.event.center.listener.DataFlowListener;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.io.ClassPathResource;
 import org.springframework.core.io.support.PropertiesLoaderUtils;
 
-import javax.naming.ConfigurationException;
 import java.util.Properties;
 
 /**
@@ -70,13 +67,9 @@ public class EventConfigInit {
         String[] listeners = properties.getProperty(DATAFLOW_LISTENER).split("\\,");
 
         for(String listener : listeners){
-
-            //这里不能直接反射,这样 IXXXService 无法注入,所以直接从spring 中获取已经注入的
-            DataFlowListener<?> dataFlowListener = (DataFlowListener<?>) ApplicationContextFactory.getBean(listener);
-
             //将 listener 放入 AppEventPublishing 中方便后期操作
             //注册侦听
-            DataFlowEventPublishing.addListener(dataFlowListener);
+            DataFlowEventPublishing.addListener(listener);
         }
     }
 

+ 2 - 0
java110-event/src/main/java/com/java110/event/center/listener/DataFlowListener.java

@@ -1,5 +1,7 @@
 package com.java110.event.center.listener;
 
+
+
 import com.java110.event.center.event.DataFlowEvent;
 
 import java.util.EventListener;

+ 6 - 4
java110-event/src/main/java/com/java110/event/service/BusinessServiceDataFlowEventPublishing.java

@@ -3,6 +3,7 @@ package com.java110.event.service;
 import com.java110.common.constant.CommonConstant;
 import com.java110.common.constant.ResponseConstant;
 import com.java110.common.exception.BusinessException;
+import com.java110.common.factory.ApplicationContextFactory;
 import com.java110.common.log.LoggerEngine;
 import com.java110.common.util.Assert;
 import com.java110.core.context.DataFlowContext;
@@ -29,7 +30,7 @@ public class BusinessServiceDataFlowEventPublishing extends LoggerEngine {
     /**
      * 保存侦听实例信息,一般启动时加载
      */
-    private final static List<BusinessServiceDataFlowListener> listeners = new ArrayList<BusinessServiceDataFlowListener>();
+    private final static List<String> listeners = new ArrayList<String>();
 
     /**
      * 根据 事件类型查询侦听
@@ -40,7 +41,7 @@ public class BusinessServiceDataFlowEventPublishing extends LoggerEngine {
      * 添加 侦听,这个只有启动时,单线程 处理,所以是线程安全的
      * @param listener
      */
-    public static void addListenner(BusinessServiceDataFlowListener listener){
+    public static void addListener(String listener){
         listeners.add(listener);
     }
 
@@ -48,7 +49,7 @@ public class BusinessServiceDataFlowEventPublishing extends LoggerEngine {
      * 获取侦听(全部侦听)
      * @return
      */
-    public static List<BusinessServiceDataFlowListener> getListeners(){
+    public static List<String> getListeners(){
         return listeners;
     }
 
@@ -68,7 +69,8 @@ public class BusinessServiceDataFlowEventPublishing extends LoggerEngine {
         }
 
         List<BusinessServiceDataFlowListener> dataFlowListeners = new ArrayList<BusinessServiceDataFlowListener>();
-        for(BusinessServiceDataFlowListener listener : getListeners()){
+        for(String listenerBeanName : getListeners()){
+            BusinessServiceDataFlowListener listener = ApplicationContextFactory.getBean(listenerBeanName,BusinessServiceDataFlowListener.class);
             if(serviceCode.equals(listener.getServiceCode())){
                 dataFlowListeners.add(listener);
             }

+ 2 - 2
java110-event/src/main/java/com/java110/event/service/init/SystemStartLoadBusinessConfigure.java

@@ -64,10 +64,10 @@ public class SystemStartLoadBusinessConfigure {
             //这里不能直接反射,这样 IXXXService 无法注入,所以直接从spring 中获取已经注入的
             //AppListener<?> appListener = (AppListener<?>)Class.forName(listener).newInstance();
             try {
-                BusinessServiceDataFlowListener businessServiceDataFlowListener = (BusinessServiceDataFlowListener) ApplicationContextFactory.getBean(listener);
+               // BusinessServiceDataFlowListener businessServiceDataFlowListener = (BusinessServiceDataFlowListener) ApplicationContextFactory.getBean(listener);
                 //将 listener 放入 AppEventPublishing 中方便后期操作
                 //注册侦听
-                BusinessServiceDataFlowEventPublishing.addListenner(businessServiceDataFlowListener);
+                BusinessServiceDataFlowEventPublishing.addListener(listener);
             }catch (Exception e){
 
             }