old mode 100644
new mode 100755
|  |  |  | 
|---|
|  |  |  | package com.genersoft.iot.vmp.gb28181.transmit.event.request.impl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.CivilCodeFileConf; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.DynamicTask; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.SipConfig; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.conf.UserSetting; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.bean.Device; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import javax.sip.RequestEvent; | 
|---|
|  |  |  | import javax.sip.header.FromHeader; | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | import java.util.ArrayList; | 
|---|
|  |  |  | import java.util.Iterator; | 
|---|
|  |  |  | import java.util.List; | 
|---|
|  |  |  | import java.util.Map; | 
|---|
|  |  |  | import java.util.concurrent.ConcurrentHashMap; | 
|---|
|  |  |  | import java.util.concurrent.CopyOnWriteArrayList; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private DynamicTask dynamicTask; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private CivilCodeFileConf civilCodeFileConf; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private SipConfig sipConfig; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private final static String talkKey = "notify-request-for-catalog-task"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public void process(RequestEvent evt) { | 
|---|
|  |  |  | 
|---|
|  |  |  | String deviceId = SipUtils.getUserIdFromFromHeader(fromHeader); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | Device device = redisCatchStorage.getDevice(deviceId); | 
|---|
|  |  |  | if (device == null || device.getOnline() == 0) { | 
|---|
|  |  |  | if (device == null || !device.isOnLine()) { | 
|---|
|  |  |  | logger.warn("[收到目录订阅]:{}, 但是设备已经离线", (device != null ? device.getDeviceId():"" )); | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | event = eventElement.getText().toUpperCase(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | DeviceChannel channel = XmlUtil.channelContentHander(itemDevice, device, event); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | DeviceChannel channel = XmlUtil.channelContentHandler(itemDevice, device, event, civilCodeFileConf); | 
|---|
|  |  |  | if (channel == null) { | 
|---|
|  |  |  | logger.info("[收到目录订阅]:但是解析失败 {}", new String(evt.getRequest().getRawContent())); | 
|---|
|  |  |  | continue; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (channel.getParentId() != null && channel.getParentId().equals(sipConfig.getId())) { | 
|---|
|  |  |  | channel.setParentId(null); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | channel.setDeviceId(device.getDeviceId()); | 
|---|
|  |  |  | logger.info("[收到目录订阅]:{}/{}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | switch (event) { | 
|---|
|  |  |  | 
|---|
|  |  |  | // 离线 | 
|---|
|  |  |  | logger.info("[收到通道离线通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | if (userSetting.getRefuseChannelStatusChannelFormNotify()) { | 
|---|
|  |  |  | logger.info("[收到通道离线通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | updateChannelOfflineList.add(channel); | 
|---|
|  |  |  | if (updateChannelOfflineList.size() > 300) { | 
|---|
|  |  |  | executeSaveForOffline(); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), channel.getChannelId(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | logger.info("[收到通道离线通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case CatalogEvent.VLOST: | 
|---|
|  |  |  | // 视频丢失 | 
|---|
|  |  |  | logger.info("[收到通道视频丢失通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | if (userSetting.getRefuseChannelStatusChannelFormNotify()) { | 
|---|
|  |  |  | logger.info("[收到通道视频丢失通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | updateChannelOfflineList.add(channel); | 
|---|
|  |  |  | if (updateChannelOfflineList.size() > 300) { | 
|---|
|  |  |  | executeSaveForOffline(); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), channel.getChannelId(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | logger.info("[收到通道视频丢失通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case CatalogEvent.DEFECT: | 
|---|
|  |  |  | // 故障 | 
|---|
|  |  |  | logger.info("[收到通道视频故障通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | if (userSetting.getRefuseChannelStatusChannelFormNotify()) { | 
|---|
|  |  |  | logger.info("[收到通道视频故障通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | updateChannelOfflineList.add(channel); | 
|---|
|  |  |  | if (updateChannelOfflineList.size() > 300) { | 
|---|
|  |  |  | executeSaveForOffline(); | 
|---|
|  |  |  | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendDeviceOrChannelStatus(device.getDeviceId(), channel.getChannelId(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | logger.info("[收到通道视频故障通知] 但是平台已配置拒绝此消息,来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | case CatalogEvent.ADD: | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else { | 
|---|
|  |  |  | addChannelMap.put(channel.getChannelId(), channel); | 
|---|
|  |  |  | if (userSetting.getDeviceStatusNotify()) { | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendChannelAddOrDelete(device.getDeviceId(), channel.getChannelId(), true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (addChannelMap.keySet().size() > 300) { | 
|---|
|  |  |  | executeSaveForAdd(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | // 删除 | 
|---|
|  |  |  | logger.info("[收到删除通道通知] 来自设备: {}, 通道 {}", device.getDeviceId(), channel.getChannelId()); | 
|---|
|  |  |  | deleteChannelList.add(channel); | 
|---|
|  |  |  | if (userSetting.getDeviceStatusNotify()) { | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendChannelAddOrDelete(device.getDeviceId(), channel.getChannelId(), false); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (deleteChannelList.size() > 300) { | 
|---|
|  |  |  | executeSaveForDelete(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | addChannelMap.put(channel.getChannelId(), channel); | 
|---|
|  |  |  | if (addChannelMap.keySet().size() > 300) { | 
|---|
|  |  |  | executeSaveForAdd(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if (userSetting.getDeviceStatusNotify()) { | 
|---|
|  |  |  | // 发送redis消息 | 
|---|
|  |  |  | redisCatchStorage.sendChannelAddOrDelete(device.getDeviceId(), channel.getChannelId(), true); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void executeSave(){ | 
|---|
|  |  |  | System.out.println("定时存储数据"); | 
|---|
|  |  |  | executeSaveForAdd(); | 
|---|
|  |  |  | executeSaveForUpdate(); | 
|---|
|  |  |  | executeSaveForDelete(); | 
|---|
|  |  |  | executeSaveForOnline(); | 
|---|