From ecdac8a738f254db2b2ea28cbe3248f7a6a7eb2b Mon Sep 17 00:00:00 2001
From: mrzcc <121184950@qq.com>
Date: 星期五, 06 三月 2020 16:18:27 +0800
Subject: [PATCH] 优化采购申请组件

---
 java110-event/src/main/java/com/java110/event/service/api/ServiceDataFlowEventPublishing.java |  113 +++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 70 insertions(+), 43 deletions(-)

diff --git a/java110-event/src/main/java/com/java110/event/service/api/ServiceDataFlowEventPublishing.java b/java110-event/src/main/java/com/java110/event/service/api/ServiceDataFlowEventPublishing.java
index 36d2d3d..f9e7bc8 100644
--- a/java110-event/src/main/java/com/java110/event/service/api/ServiceDataFlowEventPublishing.java
+++ b/java110-event/src/main/java/com/java110/event/service/api/ServiceDataFlowEventPublishing.java
@@ -1,16 +1,17 @@
 package com.java110.event.service.api;
 
-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.utils.constant.CommonConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.exception.BusinessException;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.factory.ApplicationContextFactory;
+import com.java110.utils.log.LoggerEngine;
+import com.java110.utils.util.Assert;
 import com.java110.core.context.DataFlowContext;
 import com.java110.entity.center.AppService;
 import com.java110.event.center.DataFlowListenerOrderComparator;
-import com.java110.event.service.BusinessServiceDataFlowEvent;
-import com.java110.event.service.BusinessServiceDataFlowListener;
+import org.springframework.http.HttpMethod;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -28,53 +29,63 @@
     private static Executor taskExecutor;
 
     //榛樿 绾跨▼鏁� 100
-    private final static int DEFAULT_THREAD_NUM = 100;
+    private static final int DEFAULT_THREAD_NUM = 100;
 
     /**
      * 淇濆瓨渚﹀惉瀹炰緥淇℃伅锛屼竴鑸惎鍔ㄦ椂鍔犺浇
      */
-    private final static List<String> listeners = new ArrayList<String>();
+    private static final List<String> listeners = new ArrayList<String>();
 
     /**
      * 鏍规嵁 浜嬩欢绫诲瀷鏌ヨ渚﹀惉
      */
-    private final static Map<String,List<ServiceDataFlowListener>> cacheListenersMap = new HashMap<String, List<ServiceDataFlowListener>>();
+    private static final Map<String, List<ServiceDataFlowListener>> cacheListenersMap = new HashMap<String, List<ServiceDataFlowListener>>();
 
     /**
      * 娣诲姞 渚﹀惉锛岃繖涓彧鏈夊惎鍔ㄦ椂锛屽崟绾跨▼ 澶勭悊锛屾墍浠ユ槸绾跨▼瀹夊叏鐨�
+     *
      * @param listener
      */
-    public static void addListener(String listener){
+    public static void addListener(String listener) {
         listeners.add(listener);
     }
 
     /**
      * 鑾峰彇渚﹀惉锛堝叏閮ㄤ睛鍚級
+     *
      * @return
      */
-    public static List<String> getListeners(){
+    public static List<String> getListeners() {
         return listeners;
     }
 
     /**
      * 鏍规嵁鏄惁瀹炵幇浜嗘煇涓帴鍙o紝杩斿洖渚﹀惉
+     *
      * @param serviceCode
-     * @since 1.8
      * @return
+     * @since 1.8
      */
-    public static List<ServiceDataFlowListener> getListeners(String serviceCode){
+    public static List<ServiceDataFlowListener> getListeners(String serviceCode, String httpMethod) {
 
-        Assert.hasLength(serviceCode,"鑾峰彇闇�瑕佸彂甯冪殑浜嬩欢澶勭悊渚﹀惉鏃讹紝浼犻�掍簨浠朵负绌猴紝璇锋鏌�");
+        Assert.hasLength(serviceCode, "鑾峰彇闇�瑕佸彂甯冪殑浜嬩欢澶勭悊渚﹀惉鏃讹紝浼犻�掍簨浠朵负绌猴紝璇锋鏌�");
 
+        String needCachedServiceCode = serviceCode + httpMethod;
         //鍏堜粠缂撳瓨涓幏鍙栵紝涓轰簡鎻愬崌鏁堢巼
-        if(cacheListenersMap.containsKey(serviceCode)){
-            return cacheListenersMap.get(serviceCode);
+        if (cacheListenersMap.containsKey(needCachedServiceCode)) {
+            return cacheListenersMap.get(needCachedServiceCode);
         }
 
         List<ServiceDataFlowListener> dataFlowListeners = new ArrayList<ServiceDataFlowListener>();
-        for(String listenerBeanName : getListeners()){
-            ServiceDataFlowListener listener = ApplicationContextFactory.getBean(listenerBeanName,ServiceDataFlowListener.class);
-            if(serviceCode.equals(listener.getServiceCode())){
+        for (String listenerBeanName : getListeners()) {
+            ServiceDataFlowListener listener = ApplicationContextFactory.getBean(listenerBeanName, ServiceDataFlowListener.class);
+            if (serviceCode.equals(listener.getServiceCode())
+                    && listener.getHttpMethod() == HttpMethod.valueOf(httpMethod)) {
+                dataFlowListeners.add(listener);
+            }
+            //鐗规畩澶勭悊 閫忎紶绫绘帴鍙�
+            if (ServiceCodeConstant.SERVICE_CODE_DO_SERVICE_TRANSFER.equals(listener.getServiceCode())
+                    && ServiceCodeConstant.SERVICE_CODE_DO_SERVICE_TRANSFER.equals(serviceCode)) {
                 dataFlowListeners.add(listener);
             }
         }
@@ -82,43 +93,50 @@
         //杩欓噷鎺掑簭
         DataFlowListenerOrderComparator.sort(dataFlowListeners);
 
+
         //灏嗘暟鎹斁鍏ョ紦瀛樹腑
-        cacheListenersMap.put(serviceCode,dataFlowListeners);
+        if (dataFlowListeners.size() > 0) {
+            cacheListenersMap.put(needCachedServiceCode, dataFlowListeners);
+        }
         return dataFlowListeners;
     }
 
 
     /**
      * 鍙戝竷浜嬩欢
+     *
      * @param dataFlowContext
      */
-    public static void multicastEvent(DataFlowContext dataFlowContext,AppService appService) throws BusinessException{
-        Assert.notNull(dataFlowContext.getServiceCode(),"褰撳墠娌℃湁鍙鐞嗙殑涓氬姟淇℃伅锛�");
-        multicastEvent(dataFlowContext.getServiceCode(),dataFlowContext,appService,null);
+    public static void multicastEvent(DataFlowContext dataFlowContext, AppService appService) throws BusinessException {
+        Assert.notNull(dataFlowContext.getServiceCode(), "褰撳墠娌℃湁鍙鐞嗙殑涓氬姟淇℃伅锛�");
+        multicastEvent(dataFlowContext.getServiceCode(), dataFlowContext, appService, null);
     }
 
 
     /**
      * 鍙戝竷浜嬩欢
+     *
      * @param serviceCode
      * @param dataFlowContext
      */
-    public static void multicastEvent(String serviceCode,DataFlowContext dataFlowContext,AppService appService) throws BusinessException{
-        multicastEvent(serviceCode,dataFlowContext,appService,null);
+    public static void multicastEvent(String serviceCode, DataFlowContext dataFlowContext, AppService appService) throws BusinessException {
+        multicastEvent(serviceCode, dataFlowContext, appService, null);
     }
 
     /**
      * 鍙戝竷浜嬩欢
+     *
      * @param serviceCode
      * @param dataFlowContext 杩欎釜璁㈠崟淇℃伅锛屼互渚夸簬 渚﹀惉閭h竟闇�瑕佺敤
      */
-    public static void multicastEvent(String serviceCode, DataFlowContext dataFlowContext, AppService appService, String asyn) throws  BusinessException{
+    public static void multicastEvent(String serviceCode, DataFlowContext dataFlowContext, AppService appService, String asyn) throws BusinessException {
         try {
-            ServiceDataFlowEvent targetDataFlowEvent = new ServiceDataFlowEvent(serviceCode,dataFlowContext,appService);
+            ServiceDataFlowEvent targetDataFlowEvent = new ServiceDataFlowEvent(serviceCode, dataFlowContext, appService);
 
-            multicastEvent(serviceCode,targetDataFlowEvent, asyn);
-        }catch (Exception e){
-            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR,"鍙戝竷渚﹀惉澶辫触锛屽け璐ュ師鍥犱负锛�"+e);
+            multicastEvent(serviceCode, targetDataFlowEvent, asyn);
+        } catch (Exception e) {
+            logger.error("鍙戝竷渚﹀惉澶辫触锛屽け璐ュ師鍥犱负锛�", e);
+            throw new BusinessException(ResponseConstant.RESULT_CODE_INNER_ERROR, e.getMessage());
         }
 
     }
@@ -126,13 +144,21 @@
 
     /**
      * 鍙戝竷浜嬩欢
+     *
      * @param event
-     * @param asyn A 琛ㄧず寮傛澶勭悊
+     * @param asyn  A 琛ㄧず寮傛澶勭悊
      */
-    public static void multicastEvent(String serviceCode,final ServiceDataFlowEvent event, String asyn) {
-        for (final ServiceDataFlowListener listener : getListeners(serviceCode)) {
+    public static void multicastEvent(String serviceCode, final ServiceDataFlowEvent event, String asyn) {
+        String httpMethod = event.getDataFlowContext().getRequestCurrentHeaders().get(CommonConstant.HTTP_METHOD);
+        List<ServiceDataFlowListener> listeners = getListeners(serviceCode, httpMethod);
+        //杩欓噷鍒ゆ柇 serviceCode + httpMethod 鐨勪睛鍚紝濡傛灉娌℃湁娉ㄥ唽鐩存帴鎶ラ敊銆�
+        if (listeners == null || listeners.size() == 0) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR,
+                    "鏈嶅姟銆�" + serviceCode + "銆戣皟鐢ㄦ柟寮忋��" + httpMethod + "銆戝綋鍓嶄笉鏀寔");
+        }
+        for (final ServiceDataFlowListener listener : listeners) {
 
-            if(CommonConstant.PROCESS_ORDER_ASYNCHRONOUS.equals(asyn)){ //寮傛澶勭悊
+            if (CommonConstant.PROCESS_ORDER_ASYNCHRONOUS.equals(asyn)) { //寮傛澶勭悊
 
                 Executor executor = getTaskExecutor();
                 executor.execute(new Runnable() {
@@ -142,19 +168,19 @@
                     }
                 });
                 break;
-            }
-            else {
+            } else {
                 invokeListener(listener, event);
                 break;
             }
         }
     }
 
+
     /**
      * Return the current task executor for this multicaster.
      */
     protected static synchronized Executor getTaskExecutor() {
-        if(taskExecutor == null) {
+        if (taskExecutor == null) {
             taskExecutor = Executors.newFixedThreadPool(DEFAULT_THREAD_NUM);
         }
         return taskExecutor;
@@ -162,17 +188,18 @@
 
     /**
      * Invoke the given listener with the given event.
+     *
      * @param listener the ApplicationListener to invoke
-     * @param event the current event to propagate
+     * @param event    the current event to propagate
      * @since 4.1
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
     protected static void invokeListener(ServiceDataFlowListener listener, ServiceDataFlowEvent event) {
         try {
             listener.soService(event);
-        }catch (Exception e){
-            LoggerEngine.error("鍙戝竷渚﹀惉澶辫触",e);
-            throw new RuntimeException("鍙戝竷渚﹀惉澶辫触,"+listener+ event + e);
+        } catch (Exception e) {
+            LoggerEngine.error("鍙戝竷渚﹀惉澶辫触", e);
+            throw new RuntimeException(e.getMessage());
         }
     }
 }

--
Gitblit v1.8.0