/** * 缓存位置信息汇报时间点,判断位置汇报数据是否顺序报送,排除补报数据干扰 * * @return */ private boolean isSort(VehicleMessageBean vehicleMessage) { if (vehicleMessage == null) { return false; } String msgType = vehicleMessage.getMsgType(); if ("0".equals(msgType) || "1".equals(msgType)) { String vid = vehicleMessage.getVid(); Long utc = vehicleMessage.getUtc(); if (utc == null) { return false; } String key = vid + "_utc"; if (!tmpCache.containsKey(key)) { tmpCache.put(key, utc); return true; } if (utc >= (tmpCache.get(key))) { tmpCache.put(key, utc); return true; } else { // 补传位置信息汇报数据返回false return false; } } return true; }
/** 线程执行体 */ public void run() { logger.info("插件管理应用启动"); // 启动所有接收分析管理线程 VehicleMessageBean vehicleMessage = null; Vector<PacketAnalyser> vA; int thnum = 0; // 获取插件KEY List<String> kyList = new ArrayList<String>(); Set<String> st = taAnalyser.keySet(); Iterator<String> it = st.iterator(); while (it.hasNext()) { kyList.add(it.next()); } // End while while (isRunning) { try { vehicleMessage = vPacket.take(); // String alarmType = vehicleMessage.getAlarmtype(); // logger.info("插件管理器收到数据,准备分发给业务类。-----"+alarmType); // String[] typeArray = alarmType.split(","); // 按类型进行分配 if (isSort(vehicleMessage)) { for (String type : kyList) { vA = taAnalyser.get(type); if (vA == null || vA.size() == 0) continue; thnum = (int) (Math.abs(vehicleMessage.getVid().hashCode()) % vA.size()); // logger.info("插件管理器将收到的数据----分发给业务类。-----"+type+"下的子线程>>"+thnum); // 此处需要克隆一下,然后将消息分发到不同的队列 add liangjian by 2012-11-15 15:44:29 VehicleMessageBean vehicleMessageNew = (VehicleMessageBean) BeanUtils.cloneBean(vehicleMessage); processCoordinatesByACC(vehicleMessageNew, vehicleMessageNew.getVid()); vA.elementAt(thnum).addPacket(vehicleMessageNew); } } // logger.debug("插件管理线程" + threadId + "," + vPacket.size()); } catch (Exception e) { logger.error("插件管理线程出错.", e); } } // End While logger.info("插件管理服务停止"); }