wuxw7
2018-07-02 fec26dfca0c796c2c9d4cd3c206affa0bc06c281
事件侦听改为注解方式,方便后期开发,取消配置文件方式
16个文件已修改
1 文件已重命名
5个文件已添加
670 ■■■■■ 已修改文件
CenterService/src/main/java/com/java110/center/CenterServiceApplicationStart.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CenterService/src/main/java/com/java110/center/listener/DealUserIdListener.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CenterService/src/main/java/com/java110/center/listener/ReceiveRequestListener.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StoreService/src/main/java/com/java110/store/StoreServiceApplicationStart.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
StoreService/src/main/java/com/java110/store/listener/SaveStoreInfoListener.java 216 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserService/src/main/java/com/java110/user/UserServiceApplicationStart.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserService/src/main/java/com/java110/user/listener/SaveUserAddressListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserService/src/main/java/com/java110/user/listener/SaveUserCredentialsListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserService/src/main/java/com/java110/user/listener/SaveUserInfoListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserService/src/main/java/com/java110/user/listener/SaveUserTagListener.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/annotation/Java110Listener.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscovery.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscoveryRegistrar.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/center/DataFlowEventPublishing.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/center/event/DataResponseEvent.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/center/event/ReceiveRequestEvent.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/center/init/EventConfigInit.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/center/listener/DataFlowListener.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/service/BusinessServiceDataFlowEventPublishing.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-event/src/main/java/com/java110/event/service/init/SystemStartLoadBusinessConfigure.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CenterService/src/main/java/com/java110/center/CenterServiceApplicationStart.java
@@ -2,6 +2,8 @@
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 @@
@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 @@
        ServiceStartInit.initSystemConfig(context);
        //加载事件数据
        EventConfigInit.initSystemConfig();
        //EventConfigInit.initSystemConfig();
        //刷新缓存
        flushMainCache(args);
CenterService/src/main/java/com/java110/center/listener/DealUserIdListener.java
File was renamed from 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);
CenterService/src/main/java/com/java110/center/listener/ReceiveRequestListener.java
New file
@@ -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);
    }
}
CenterService/src/main/java/com/java110/center/smo/impl/CenterServiceSMOImpl.java
@@ -70,19 +70,23 @@
            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 @@
                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;
        }
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 @@
 */
@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 @@
        ApplicationContext context = SpringApplication.run(StoreServiceApplicationStart.class, args);
        ServiceStartInit.initSystemConfig(context);
        //加载业务侦听
        SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
        //SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
    }
}
StoreService/src/main/java/com/java110/store/listener/SaveStoreInfoListener.java
New file
@@ -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;
    }
}
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 @@
 */
@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 @@
        ApplicationContext context = SpringApplication.run(UserServiceApplicationStart.class, args);
        ServiceStartInit.initSystemConfig(context);
        //加载业务侦听
        SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
       // SystemStartLoadBusinessConfigure.initSystemConfig(LISTENER_PATH);
    }
}
UserService/src/main/java/com/java110/user/listener/SaveUserAddressListener.java
@@ -8,6 +8,7 @@
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 @@
 * 保存 用户信息 侦听
 * Created by wuxw on 2018/5/18.
 */
@Service("saveUserAddress")
@Java110Listener(name = "saveUserAddressListener")
@Transactional
public class SaveUserAddressListener implements BusinessServiceDataFlowListener{
UserService/src/main/java/com/java110/user/listener/SaveUserCredentialsListener.java
@@ -7,6 +7,7 @@
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 @@
 * 保存 用户信息 侦听
 * Created by wuxw on 2018/5/18.
 */
@Service("saveUserCredentials")
@Java110Listener("saveUserCredentialsListener")
@Transactional
public class SaveUserCredentialsListener extends LoggerEngine implements BusinessServiceDataFlowListener{
UserService/src/main/java/com/java110/user/listener/SaveUserInfoListener.java
@@ -7,6 +7,7 @@
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 @@
 * 保存 用户信息 侦听
 * Created by wuxw on 2018/5/18.
 */
@Service("saveUserInfo")
@Java110Listener("saveUserInfoListener")
@Transactional
public class SaveUserInfoListener extends LoggerEngine implements BusinessServiceDataFlowListener{
UserService/src/main/java/com/java110/user/listener/SaveUserTagListener.java
@@ -8,6 +8,7 @@
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 @@
 * 保存 用户信息 侦听
 * Created by wuxw on 2018/5/18.
 */
@Service("saveUserTag")
@Java110Listener("saveUserTagListener")
@Transactional
public class SaveUserTagListener extends LoggerEngine implements BusinessServiceDataFlowListener{
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java
@@ -85,6 +85,11 @@
     */
    public static final String SERVICE_CODE_SAVE_USER_CREDENTIALS = "save.user.credentials";
    /**
     * 保存商户信息
     */
    public static final String SERVICE_CODE_SAVE_STORE_INFO = "save.store.info";
java110-core/src/main/java/com/java110/core/annotation/Java110Listener.java
New file
@@ -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 "";
}
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscovery.java
New file
@@ -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();
}
java110-core/src/main/java/com/java110/core/annotation/Java110ListenerDiscoveryRegistrar.java
New file
@@ -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;
    }
}
java110-event/src/main/java/com/java110/event/center/DataFlowEventPublishing.java
@@ -2,11 +2,11 @@
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 @@
    /**
     * 保存侦听实例信息,一般启动时加载
     */
    private final static List<DataFlowListener<?>> listeners = new ArrayList<DataFlowListener<?>>();
    private final static List<String> listeners = new ArrayList<String>();
    /**
     * 保存事件实例信息,一般启动时加载
@@ -52,15 +52,25 @@
     * 添加 侦听,这个只有启动时,单线程 处理,所以是线程安全的
     * @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 @@
     */
    private static List<DataFlowListener<?>> getListeners(String interfaceClassName){
        Assert.isNull(interfaceClassName,"获取需要发布的事件处理侦听时,传递事件为空,请检查");
        Assert.hasLength(interfaceClassName,"获取需要发布的事件处理侦听时,传递事件为空,请检查");
        //先从缓存中获取,为了提升效率
        if(cacheListenersMap.containsKey(interfaceClassName)){
@@ -80,7 +90,9 @@
        }
        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 @@
     */
    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 @@
        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));
    }
    /***********************************************发布侦听 结束***************************************************************/
}
java110-event/src/main/java/com/java110/event/center/event/DataResponseEvent.java
@@ -2,11 +2,18 @@
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 @@
     * @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;
    }
}
java110-event/src/main/java/com/java110/event/center/event/ReceiveRequestEvent.java
@@ -25,4 +25,12 @@
        this.requestData = requestData;
        this.headers = headers;
    }
    public String getRequestData() {
        return requestData;
    }
    public Map<String, String> getHeaders() {
        return headers;
    }
}
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 @@
        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);
        }
    }
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;
java110-event/src/main/java/com/java110/event/service/BusinessServiceDataFlowEventPublishing.java
@@ -3,6 +3,7 @@
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 @@
    /**
     * 保存侦听实例信息,一般启动时加载
     */
    private final static List<BusinessServiceDataFlowListener> listeners = new ArrayList<BusinessServiceDataFlowListener>();
    private final static List<String> listeners = new ArrayList<String>();
    /**
     * 根据 事件类型查询侦听
@@ -40,7 +41,7 @@
     * 添加 侦听,这个只有启动时,单线程 处理,所以是线程安全的
     * @param listener
     */
    public static void addListenner(BusinessServiceDataFlowListener listener){
    public static void addListener(String listener){
        listeners.add(listener);
    }
@@ -48,7 +49,7 @@
     * 获取侦听(全部侦听)
     * @return
     */
    public static List<BusinessServiceDataFlowListener> getListeners(){
    public static List<String> getListeners(){
        return listeners;
    }
@@ -68,7 +69,8 @@
        }
        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);
            }
java110-event/src/main/java/com/java110/event/service/init/SystemStartLoadBusinessConfigure.java
@@ -64,10 +64,10 @@
            //这里不能直接反射,这样 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){
            }