648540858
2023-03-21 82adc0cb23f3ee47322e78889cdaba57e9309000
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/callback/DeferredResultHolder.java
@@ -1,14 +1,14 @@
package com.genersoft.iot.vmp.gb28181.transmit.callback;
import java.util.HashMap;
import com.genersoft.iot.vmp.vmanager.bean.DeferredResultEx;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.web.context.request.async.DeferredResult;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.async.DeferredResult;
/**    
 * @description: 异步请求处理
@@ -35,9 +35,13 @@
   public static final String CALLBACK_CMD_PLAY = "CALLBACK_PLAY";
   public static final String CALLBACK_CMD_PLAYBACK = "CALLBACK_PLAYBACK";
   public static final String CALLBACK_CMD_DOWNLOAD = "CALLBACK_DOWNLOAD";
   public static final String CALLBACK_CMD_STOP = "CALLBACK_STOP";
   public static final String CALLBACK_ONVIF = "CALLBACK_ONVIF";
   public static final String UPLOAD_FILE_CHANNEL = "UPLOAD_FILE_CHANNEL";
   public static final String CALLBACK_CMD_MOBILEPOSITION = "CALLBACK_MOBILEPOSITION";
@@ -45,29 +49,48 @@
   public static final String CALLBACK_CMD_ALARM = "CALLBACK_ALARM";
   public static final String CALLBACK_CMD_BROADCAST = "CALLBACK_BROADCAST";
   private Map<String, Map<String, DeferredResult>> map = new ConcurrentHashMap<>();
   private Map<String, Map<String, DeferredResultEx>> map = new ConcurrentHashMap<>();
   public void put(String key, String id, DeferredResult result) {
      Map<String, DeferredResult> deferredResultMap = map.get(key);
   public void put(String key, String id, DeferredResultEx result) {
      Map<String, DeferredResultEx> deferredResultMap = map.get(key);
      if (deferredResultMap == null) {
         deferredResultMap = new ConcurrentHashMap<>();
         map.put(key, deferredResultMap);
      }
      deferredResultMap.put(id, result);
   }
   public void put(String key, String id, DeferredResult result) {
      Map<String, DeferredResultEx> deferredResultMap = map.get(key);
      if (deferredResultMap == null) {
         deferredResultMap = new ConcurrentHashMap<>();
         map.put(key, deferredResultMap);
      }
      deferredResultMap.put(id, new DeferredResultEx(result));
   }
   
   public DeferredResult get(String key, String id) {
      Map<String, DeferredResult> deferredResultMap = map.get(key);
      if (deferredResultMap == null) return null;
   public DeferredResultEx get(String key, String id) {
      Map<String, DeferredResultEx> deferredResultMap = map.get(key);
      if (deferredResultMap == null || ObjectUtils.isEmpty(id)) {
         return null;
      }
      return deferredResultMap.get(id);
   }
   public Collection<DeferredResultEx> getAllByKey(String key) {
      Map<String, DeferredResultEx> deferredResultMap = map.get(key);
      if (deferredResultMap == null) {
         return null;
      }
      return deferredResultMap.values();
   }
   public boolean exist(String key, String id){
      if (key == null) return false;
      Map<String, DeferredResult> deferredResultMap = map.get(key);
      if (key == null) {
         return false;
      }
      Map<String, DeferredResultEx> deferredResultMap = map.get(key);
      if (id == null) {
         return deferredResultMap != null;
      }else {
@@ -80,15 +103,15 @@
    * @param msg
    */
   public void invokeResult(RequestMessage msg) {
      Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
      Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
      if (deferredResultMap == null) {
         return;
      }
      DeferredResult result = deferredResultMap.get(msg.getId());
      DeferredResultEx result = deferredResultMap.get(msg.getId());
      if (result == null) {
         return;
      }
      result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
      result.getDeferredResult().setResult(msg.getData());
      deferredResultMap.remove(msg.getId());
      if (deferredResultMap.size() == 0) {
         map.remove(msg.getKey());
@@ -100,19 +123,30 @@
    * @param msg
    */
   public void invokeAllResult(RequestMessage msg) {
      Map<String, DeferredResult> deferredResultMap = map.get(msg.getKey());
      Map<String, DeferredResultEx> deferredResultMap = map.get(msg.getKey());
      if (deferredResultMap == null) {
         return;
      }
      Set<String> ids = deferredResultMap.keySet();
      for (String id : ids) {
         DeferredResult result = deferredResultMap.get(id);
         if (result == null) {
      synchronized (this) {
         deferredResultMap = map.get(msg.getKey());
         if (deferredResultMap == null) {
            return;
         }
         result.setResult(new ResponseEntity<>(msg.getData(),HttpStatus.OK));
      }
      map.remove(msg.getKey());
         Set<String> ids = deferredResultMap.keySet();
         for (String id : ids) {
            DeferredResultEx result = deferredResultMap.get(id);
            if (result == null) {
               return;
            }
            if (result.getFilter() != null) {
               Object handler = result.getFilter().handler(msg.getData());
               result.getDeferredResult().setResult(handler);
            }else {
               result.getDeferredResult().setResult(msg.getData());
            }
         }
         map.remove(msg.getKey());
      }
   }
}