|  |  |  | 
|---|
|  |  |  | 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: 异步请求处理 | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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 { | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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()); | 
|---|
|  |  |  | 
|---|
|  |  |  | * @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(ResponseEntity.ok().body(msg.getData())); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 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()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|