Commit 470aa479695a7821ef58457db9bd44dabba4acbf
1 parent
c041aacc
优化队列的处理逻辑
Showing
4 changed files
with
86 additions
and
75 deletions
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
| ... | ... | @@ -116,14 +116,17 @@ public class NotifyRequestProcessor extends SIPRequestProcessorParent implements |
| 116 | 116 | logger.info("接收到消息:" + cmd); |
| 117 | 117 | } |
| 118 | 118 | } catch (DocumentException e) { |
| 119 | - throw new RuntimeException(e); | |
| 119 | + logger.error("处理NOTIFY消息时错误", e); | |
| 120 | + } finally { | |
| 121 | + taskQueueHandlerRun = false; | |
| 120 | 122 | } |
| 121 | 123 | } |
| 122 | - taskQueueHandlerRun = false; | |
| 123 | 124 | }); |
| 124 | 125 | } |
| 125 | 126 | } catch (SipException | InvalidArgumentException | ParseException e) { |
| 126 | 127 | e.printStackTrace(); |
| 128 | + } finally { | |
| 129 | + taskQueueHandlerRun = false; | |
| 127 | 130 | } |
| 128 | 131 | } |
| 129 | 132 | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/CatalogResponseMessageHandler.java
| ... | ... | @@ -35,6 +35,9 @@ import java.util.Iterator; |
| 35 | 35 | import java.util.List; |
| 36 | 36 | import java.util.concurrent.ConcurrentLinkedQueue; |
| 37 | 37 | |
| 38 | +/** | |
| 39 | + * 目录查询的回复 | |
| 40 | + */ | |
| 38 | 41 | @Component |
| 39 | 42 | public class CatalogResponseMessageHandler extends SIPRequestProcessorParent implements InitializingBean, IMessageHandler { |
| 40 | 43 | |
| ... | ... | @@ -85,82 +88,83 @@ public class CatalogResponseMessageHandler extends SIPRequestProcessorParent imp |
| 85 | 88 | // 回复200 OK |
| 86 | 89 | try { |
| 87 | 90 | responseAck(evt, Response.OK); |
| 91 | + if (!taskQueueHandlerRun) { | |
| 92 | + taskQueueHandlerRun = true; | |
| 93 | + taskExecutor.execute(()-> { | |
| 94 | + while (!taskQueue.isEmpty()) { | |
| 95 | + HandlerCatchData take = taskQueue.poll(); | |
| 96 | + try { | |
| 97 | + Element rootElement = getRootElement(take.getEvt(), take.getDevice().getCharset()); | |
| 98 | + Element deviceListElement = rootElement.element("DeviceList"); | |
| 99 | + Element sumNumElement = rootElement.element("SumNum"); | |
| 100 | + Element snElement = rootElement.element("SN"); | |
| 101 | + if (snElement == null || sumNumElement == null || deviceListElement == null) { | |
| 102 | + responseAck(take.getEvt(), Response.BAD_REQUEST, "xml error"); | |
| 103 | + return; | |
| 104 | + } | |
| 105 | + int sumNum = Integer.parseInt(sumNumElement.getText()); | |
| 106 | + | |
| 107 | + if (sumNum == 0) { | |
| 108 | + logger.info("[收到通道]设备:{}的: 0个", take.getDevice().getDeviceId()); | |
| 109 | + // 数据已经完整接收 | |
| 110 | + storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); | |
| 111 | + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); | |
| 112 | + }else { | |
| 113 | + Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); | |
| 114 | + if (deviceListIterator != null) { | |
| 115 | + List<DeviceChannel> channelList = new ArrayList<>(); | |
| 116 | + // 遍历DeviceList | |
| 117 | + while (deviceListIterator.hasNext()) { | |
| 118 | + Element itemDevice = deviceListIterator.next(); | |
| 119 | + Element channelDeviceElement = itemDevice.element("DeviceID"); | |
| 120 | + if (channelDeviceElement == null) { | |
| 121 | + continue; | |
| 122 | + } | |
| 123 | + DeviceChannel deviceChannel = XmlUtil.channelContentHander(itemDevice, device, null); | |
| 124 | + deviceChannel.setDeviceId(take.getDevice().getDeviceId()); | |
| 125 | + | |
| 126 | + channelList.add(deviceChannel); | |
| 127 | + } | |
| 128 | + int sn = Integer.parseInt(snElement.getText()); | |
| 129 | + catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); | |
| 130 | + logger.info("[收到通道]设备: {} -> {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); | |
| 131 | + if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { | |
| 132 | + // 数据已经完整接收 | |
| 133 | + boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); | |
| 134 | + if (!resetChannelsResult) { | |
| 135 | + String errorMsg = "接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(take.getDevice().getDeviceId()).size() + "条"; | |
| 136 | + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), errorMsg); | |
| 137 | + }else { | |
| 138 | + catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); | |
| 139 | + } | |
| 140 | + } | |
| 141 | + } | |
| 142 | + | |
| 143 | + } | |
| 144 | + } catch (DocumentException e) { | |
| 145 | + e.printStackTrace(); | |
| 146 | + } catch (InvalidArgumentException e) { | |
| 147 | + e.printStackTrace(); | |
| 148 | + } catch (ParseException e) { | |
| 149 | + e.printStackTrace(); | |
| 150 | + } catch (SipException e) { | |
| 151 | + e.printStackTrace(); | |
| 152 | + } finally { | |
| 153 | + taskQueueHandlerRun = false; | |
| 154 | + } | |
| 155 | + } | |
| 156 | + }); | |
| 157 | + } | |
| 88 | 158 | } catch (SipException e) { |
| 89 | 159 | throw new RuntimeException(e); |
| 90 | 160 | } catch (InvalidArgumentException e) { |
| 91 | 161 | throw new RuntimeException(e); |
| 92 | 162 | } catch (ParseException e) { |
| 93 | 163 | throw new RuntimeException(e); |
| 164 | + } finally { | |
| 165 | + taskQueueHandlerRun = false; | |
| 94 | 166 | } |
| 95 | - if (!taskQueueHandlerRun) { | |
| 96 | - taskQueueHandlerRun = true; | |
| 97 | - taskExecutor.execute(()-> { | |
| 98 | - while (!taskQueue.isEmpty()) { | |
| 99 | - HandlerCatchData take = taskQueue.poll(); | |
| 100 | - String key = DeferredResultHolder.CALLBACK_CMD_CATALOG + take.getDevice().getDeviceId(); | |
| 101 | - Element rootElement = null; | |
| 102 | - try { | |
| 103 | - rootElement = getRootElement(take.getEvt(), take.getDevice().getCharset()); | |
| 104 | - Element deviceListElement = rootElement.element("DeviceList"); | |
| 105 | - Element sumNumElement = rootElement.element("SumNum"); | |
| 106 | - Element snElement = rootElement.element("SN"); | |
| 107 | - if (snElement == null || sumNumElement == null || deviceListElement == null) { | |
| 108 | - responseAck(take.getEvt(), Response.BAD_REQUEST, "xml error"); | |
| 109 | - return; | |
| 110 | - } | |
| 111 | - int sumNum = Integer.parseInt(sumNumElement.getText()); | |
| 112 | - | |
| 113 | - if (sumNum == 0) { | |
| 114 | - logger.info("[收到通道]设备:{}的: 0个", take.getDevice().getDeviceId()); | |
| 115 | - // 数据已经完整接收 | |
| 116 | - storager.cleanChannelsForDevice(take.getDevice().getDeviceId()); | |
| 117 | - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); | |
| 118 | - }else { | |
| 119 | - Iterator<Element> deviceListIterator = deviceListElement.elementIterator(); | |
| 120 | - if (deviceListIterator != null) { | |
| 121 | - List<DeviceChannel> channelList = new ArrayList<>(); | |
| 122 | - // 遍历DeviceList | |
| 123 | - while (deviceListIterator.hasNext()) { | |
| 124 | - Element itemDevice = deviceListIterator.next(); | |
| 125 | - Element channelDeviceElement = itemDevice.element("DeviceID"); | |
| 126 | - if (channelDeviceElement == null) { | |
| 127 | - continue; | |
| 128 | - } | |
| 129 | - DeviceChannel deviceChannel = XmlUtil.channelContentHander(itemDevice, device, null); | |
| 130 | - deviceChannel.setDeviceId(take.getDevice().getDeviceId()); | |
| 131 | 167 | |
| 132 | - channelList.add(deviceChannel); | |
| 133 | - } | |
| 134 | - int sn = Integer.parseInt(snElement.getText()); | |
| 135 | - catalogDataCatch.put(take.getDevice().getDeviceId(), sn, sumNum, take.getDevice(), channelList); | |
| 136 | - logger.info("[收到通道]设备: {} -> {}个,{}/{}", take.getDevice().getDeviceId(), channelList.size(), catalogDataCatch.get(take.getDevice().getDeviceId()) == null ? 0 :catalogDataCatch.get(take.getDevice().getDeviceId()).size(), sumNum); | |
| 137 | - if (catalogDataCatch.get(take.getDevice().getDeviceId()).size() == sumNum) { | |
| 138 | - // 数据已经完整接收 | |
| 139 | - boolean resetChannelsResult = storager.resetChannels(take.getDevice().getDeviceId(), catalogDataCatch.get(take.getDevice().getDeviceId())); | |
| 140 | - if (!resetChannelsResult) { | |
| 141 | - String errorMsg = "接收成功,写入失败,共" + sumNum + "条,已接收" + catalogDataCatch.get(take.getDevice().getDeviceId()).size() + "条"; | |
| 142 | - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), errorMsg); | |
| 143 | - }else { | |
| 144 | - catalogDataCatch.setChannelSyncEnd(take.getDevice().getDeviceId(), null); | |
| 145 | - } | |
| 146 | - } | |
| 147 | - } | |
| 148 | - | |
| 149 | - } | |
| 150 | - } catch (DocumentException e) { | |
| 151 | - e.printStackTrace(); | |
| 152 | - } catch (InvalidArgumentException e) { | |
| 153 | - e.printStackTrace(); | |
| 154 | - } catch (ParseException e) { | |
| 155 | - e.printStackTrace(); | |
| 156 | - } catch (SipException e) { | |
| 157 | - e.printStackTrace(); | |
| 158 | - } | |
| 159 | - } | |
| 160 | - taskQueueHandlerRun = false; | |
| 161 | - }); | |
| 162 | - | |
| 163 | - } | |
| 164 | 168 | } |
| 165 | 169 | |
| 166 | 170 | @Override | ... | ... |
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/response/cmd/RecordInfoResponseMessageHandler.java
| ... | ... | @@ -76,8 +76,8 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent |
| 76 | 76 | if (!taskQueueHandlerRun) { |
| 77 | 77 | taskQueueHandlerRun = true; |
| 78 | 78 | taskExecutor.execute(()->{ |
| 79 | - try { | |
| 80 | - while (!taskQueue.isEmpty()) { | |
| 79 | + while (!taskQueue.isEmpty()) { | |
| 80 | + try { | |
| 81 | 81 | HandlerCatchData take = taskQueue.poll(); |
| 82 | 82 | Element rootElementForCharset = getRootElement(take.getEvt(), take.getDevice().getCharset()); |
| 83 | 83 | String sn = getText(rootElementForCharset, "SN"); |
| ... | ... | @@ -141,10 +141,11 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent |
| 141 | 141 | releaseRequest(take.getDevice().getDeviceId(), sn); |
| 142 | 142 | } |
| 143 | 143 | } |
| 144 | + } catch (DocumentException e) { | |
| 145 | + throw new RuntimeException(e); | |
| 146 | + } finally { | |
| 147 | + taskQueueHandlerRun = false; | |
| 144 | 148 | } |
| 145 | - taskQueueHandlerRun = false; | |
| 146 | - }catch (DocumentException e) { | |
| 147 | - throw new RuntimeException(e); | |
| 148 | 149 | } |
| 149 | 150 | }); |
| 150 | 151 | } |
| ... | ... | @@ -155,6 +156,8 @@ public class RecordInfoResponseMessageHandler extends SIPRequestProcessorParent |
| 155 | 156 | e.printStackTrace(); |
| 156 | 157 | } catch (ParseException e) { |
| 157 | 158 | e.printStackTrace(); |
| 159 | + }finally { | |
| 160 | + taskQueueHandlerRun = false; | |
| 158 | 161 | } |
| 159 | 162 | } |
| 160 | 163 | ... | ... |
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
| ... | ... | @@ -105,6 +105,7 @@ public class DeviceServiceImpl implements IDeviceService { |
| 105 | 105 | redisCatchStorage.updateDevice(device); |
| 106 | 106 | commander.deviceInfoQuery(device); |
| 107 | 107 | sync(device); |
| 108 | + // TODO 如果设备下的通道级联到了其他平台,那么需要发送事件或者notify给上级平台 | |
| 108 | 109 | }else { |
| 109 | 110 | deviceMapper.update(device); |
| 110 | 111 | redisCatchStorage.updateDevice(device); | ... | ... |