⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parsev3pmdatafile.java

📁 解析特定16进制文件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:

						saveToRecordOrientedMap(guideLineData);

					}// end for

					dataCount += measObjCnt;
					insertCount += measObjCnt;

				}
				/***************************************************************
				 * liuyuan 2008-2-3 CRMCN00003425
				 * TDR2000新增计数器组42,TDR3000新增计数器组28, 所包含的计数器均为干扰功率的计数器,
				 * 其处理方式和TDR3000中的22组计数器中的干扰功率相关的计数器处理方式完全一样,参照处理。
				 **************************************************************/
				else if (groupId == 28) {
					// log.debug(NewParseV3DataFile.class, new StringBuilder()
					// .append("parse pmdata file : 计数器组ID ").append(
					// groupId).append("测量对象个数 ").append(
					// measObjCnt).toString());
					for (int i = 0; i < measObjCnt; i++) {
						GuideLineData guideLineData = new GuideLineData();

						// add by liuyuan 2007-7-19 增加设置计数器组ID
						guideLineData.setCounterGroupId(groupId);
						// end by liuyuan

						/* dn */
						NeMoi nemoi = new NeMoi();
						nemoi.setMoc(msgInStream.readInt());
						// count = count + 4;

						nemoi.setMoi(msgInStream.readBytes(8));
						// count = count + 8;
						String dn = IimUtil.NeMoitoDn(type, nemoi);
						count = count + 12;
						// log.debug(ParseV3DataFile.class, new StringBuilder()
						// .append("parse pmdata file : dn_").append(i)
						// .append(" ").append(dn).toString());
						guideLineData.setDn(dn);

						readTimeInfo(msgInStream, guideLineData,
								endTimeSetInV3Group);
						count = count + 8;

						List<NameValue> nvs = new ArrayList<NameValue>();

						/* 计数器值 */
						for (int j = 0; j < counterCnt; j++) {
							NameValue nv = new NameValue();

							// modify by liuyuan 2007-4-13
							// 读取UINT32变量,用readUInt方法,读取为long型
							// BUGCN00015892
							// nv.setValue(msgInStream.readUInt());
							// 干扰功率计算公式,进行转换
							nv.setValue(PmUtil.DisturbPowTransform(msgInStream
									.readUInt()));
							count = count + 4;

							nv.setName(names.get(j));
							nvs.add(nv);

							// log.debug("parse pmdata file : " + nv.getName() +
							// " : " + nv.getValue());

						}// end for

						guideLineData.setNvs(nvs);

						/*
						 * 在解析得到所有数据后再进行入库操作, 为了保证在解析文件中不出现数据错误
						 */
						// gldata.add(guideLineData);
						// dataCount++;
						saveToRecordOrientedMap(guideLineData);

					}// end for
					dataCount += measObjCnt;
					insertCount += measObjCnt;
				}
				/***************************************************************
				 * end by liuyuan 2008-2-3 CRMCN00003425
				 **************************************************************/
				else {
					// log.debug(NewParseV3DataFile.class, new StringBuilder()
					// .append("parse pmdata file : 计数器组ID ").append(
					// groupId).append("测量对象个数 ").append(
					// measObjCnt).toString());
					// elapsedTimer.reset("解析计数器组(所有DN)");
					for (int i = 0; i < measObjCnt; i++) {
						GuideLineData guideLineData = new GuideLineData();

						// add by liuyuan 2007-7-19 增加设置计数器组ID
						guideLineData.setCounterGroupId(groupId);
						// end by liuyuan

						/* dn */
						NeMoi nemoi = new NeMoi();
						nemoi.setMoc(msgInStream.readInt());
						// count = count + 4;

						nemoi.setMoi(msgInStream.readBytes(8));
						// count = count + 8;
						String dn = IimUtil.NeMoitoDn(type, nemoi);

						count = count + 12;
						// log.debug(ParseV3DataFile.class, new StringBuilder()
						// .append("parse pmdata file : dn_").append(i)
						// .append(" ").append(dn).toString());
						guideLineData.setDn(dn);

						readTimeInfo(msgInStream, guideLineData,
								endTimeSetInV3Group);
						count = count + 8;

						List<NameValue> nvs = new ArrayList<NameValue>();

						/* 计数器值 */
						for (int j = 0; j < counterCnt; j++) {
							NameValue nv = new NameValue();

							// modify by liuyuan 2007-4-13
							// 读取UINT32变量,用readUInt方法,读取为long型
							// BUGCN00015892
							nv.setValue(msgInStream.readUInt());
							count = count + 4;

							nv.setName(names.get(j));
							nvs.add(nv);

							// log.debug("parse pmdata file : " + nv.getName() +
							// " : " + nv.getValue());

						}// end for

						guideLineData.setNvs(nvs);

						/*
						 * 在解析得到所有数据后再进行入库操作, 为了保证在解析文件中不出现数据错误
						 */
						// gldata.add(guideLineData);
						saveToRecordOrientedMap(guideLineData);
						// dataCount++;
					}// end for
					dataCount += measObjCnt;
					insertCount += measObjCnt;
					// elapsedTimer.stop();
				}// end else

				// log.debug(ParseV3DataFile.class, " parse use time end " +
				// System.currentTimeMillis());

				/* 一条记录读取完毕 */
				if (count == lRecordLen) {
					error = error + lRecordLen + 4;
					count = 0;
				} else {
					log.error(ParseV3PMDataFile.class, new StringBuilder()
							.append("V3数据文件格式无效,解析失败").append(" count = ")
							.append(count).append(" RecordLen = ").append(
									lRecordLen).toString());
					throw new FileParseException("V3数据文件格式无效,解析失败");
				}

				// 将该计数器组的结束时间的集合放入Map中
				if (v3CounterGroupMap.containsKey(groupId)) {
					v3CounterGroupMap.get(groupId).addAll(endTimeSetInV3Group);
				} else {
					v3CounterGroupMap.put(groupId, endTimeSetInV3Group);
				}

				/**
				 * xingyong 2008-11-11 14M的性能数据(参数 300个NodeB 挂3个小区
				 * 每个小区3个载波),能达到的GuideLineData对象的数目是29704,产生的虚拟GuideLineData数目为8102.
				 * 虚拟GuideLineData数目可以认为是实际插入数据记录数.
				 * 虚拟GuideLineData有多条相关的(在同一表且同一记录的)实际GuideLineData组成.
				 * 所以取10000为强制插入的经验值. 如果该值,可能会导致内存溢出,太小则数据库会产生很多碎片记录.
				 * 所谓碎片记录是指本来一条数据库记录可以存储的数据,分成了多条记录. 碎片记录会严重影响数据库的查询效率.
				 * 实际证明1000还是过大. 理想情况是该值计数器组所测量的对象最大数目,也就是载波dn数目 300*3*3 = 2700
				 */

				if (recordOrientedMap.size() >= 2710) {
					log.debug(this.getClass(), "recordOrientedMap已满:"
							+ recordOrientedMap.size());
					insertDB();
					insertCount = 0;
				}
				// if(insertCount/recordOrientedMap.size() >=3){
				// insertDB();
				// insertCount = 0;
				// }

				// log.debug(this.getClass(),"insertCount:"+insertCount);
				// log.debug(this.getClass(),"real
				// insertCount:"+recordOrientedMap.size());

				/* 如果到达文件的末尾 */
				if (datain.available() == 0) {
					// elapsedTimer.reset("insertDB");
					insertDB();
					// elapsedTimer.stop();
					break;
				}

			}// end while

			// 插入TBL_GUIDE_LINE_DATA_RECENT,以便性能服务器可以判断是否有延迟告警
			// elapsedTimer.reset("insertLatecyInfo");
			insertLatecyInfo(conn, file, rncId);
			// elapsedTimer.stop();

			// 提交事务
			// elapsedTimer.reset("commit");
			conn.commit();
			// elapsedTimer.stop();
			// long end = System.currentTimeMillis();
			// log.info(ParseV3DataFile.class, new StringBuilder().append(
			// "parse pmdata file : ").append("数据插入成功_记录个数 ").append(
			// dataCount).append(" 入库的时间 ").append(new Date()).toString());
			// log.info(ParseV3DataFile.class, "解析文件入库 " + file.getName() + " 耗时
			// "
			// + (end - begin) / 1000);

			closeFile(filein, datain);
			filein = null;
			datain = null;

			/* 删除本地的文件,加入删除队列 */
			if (file.exists() && !file.delete()) {
				/* 如果删除失败,则加入到队列后,继续删除 */
				DeleteFileQueue.getInstance().putDeleteFile(file);
				log.error(ParseV3PMDataFile.class, new StringBuilder().append(
						"删除本地性能数据文件失败! ").append(file.getAbsoluteFile())
						.toString());
			} else {
				/* 删除成功 */
				log.info(ParseV3PMDataFile.class, new StringBuilder().append(
						"删除本地性能数据文件成功! ").append(file.getAbsoluteFile())
						.toString());
			}

		} catch (SQLException e) {
			log.error(new StringBuilder().append("解析性能数据文件 ").append(
					file.getName()).append(",提交入库失败!").append(e.getMessage())
					.toString(), e);
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.error(e.getMessage(), e);
			}
			// 放入解析异常队列,等待下次的解析
			// 填入异常记录
			fileinfo.setExceptionInfo(new Date(), FileInfo.DB_EXCEPTION);
			ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);

		} catch (DatabaseException e) {
			// add by liuyuan 增加入库操作发生异常时的打印日志
			log.error(new StringBuilder().append("解析性能数据文件 ").append(
					file.getName()).append(",数据入库发生异常!").append(e.getMessage())
					.toString(), e);
			try {
				conn.rollback();
			} catch (SQLException e1) {
				log.error(e.getMessage(), e);
			}
			// 放入解析异常队列,等待下次的解析
			// 填入异常记录
			fileinfo.setExceptionInfo(new Date(), FileInfo.DB_EXCEPTION);
			ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);

		} catch (FileNotFoundException e) {
			log.error("找不到文件 " + file.getName(), e);
		} catch (EOFException ex) {// 在IOException前捕捉,证明是文件格式的问题
			closeFile(filein, datain);
			// error = error + count + 4;
			log.error("解析文件异常: " + file.getName() + " 错误位置: " + error, ex);
			File f = new File(PmConst.PM_DIR + File.separator + file.getName()
					+ ".bad");
			boolean save = file.renameTo(f);
			if (save) {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 成功");
			} else {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 失败");
			}
		} catch (IOException e) {
			closeFile(filein, datain);
			log.error("读取文件异常 " + file.getName(), e);
			// 放入解析异常队列,等待下次的解析
			// 填入异常记录
			fileinfo.setExceptionInfo(new Date(), FileInfo.IO_EXCEPTION);
			ParseFileExceptionQueue.getInstance().putParseFile(fileinfo);
		}// modify by liuyuan 2008-4-2 CNBUG00016270 加入解析文件时出错信息的定位
		catch (FileParseException e) {
			closeFile(filein, datain);
			// error = error + count + 4;
			log.error("解析文件异常: " + file.getName() + " 错误位置: " + error, e);
			File f = new File(PmConst.PM_DIR + File.separator + file.getName()
					+ ".bad");
			boolean save = file.renameTo(f);
			if (save) {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 成功");
			} else {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 失败");
			}
		} catch (Exception e) {
			closeFile(filein, datain);
			error = error + count + 4;
			log.error("解析文件异常:" + file.getName() + " 错误位置: " + error, e);
			File f = new File(PmConst.PM_DIR + File.separator + file.getName()
					+ ".bad");
			boolean save = file.renameTo(f);
			if (save) {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 成功");
			} else {
				log.error(ParseV3PMDataFile.class, "保存文件为 " + f.getName()
						+ " 失败");
			}
		} finally {
			try {
				// 清空缓存
				defaultBeginTime = null;
				defaultEndTime = null;
				tableAndDnMap.clear();

				v3CounterGroupMap.clear();
				recordOrientedMap.clear();
				batchCounter = 0;
				// 关闭解析流
				closeFile(filein, datain);
				if (useDBConnectonPool) {
					// conn将保留以后复用

				} else {
					if (conn != null) {
						// 关闭连接时,会自动关闭该连接上的statement
						for (PreparedStatement tempP : preparedStatementMap
								.values()) {
							tempP.close();
						}
						preparedStatementMap.clear();
						conn.close();
					}
				}
			} catch (SQLException e) {
				log.error(e.getMessage(), e);
			}
			// elapsedTimer.stop();
			long endTestTime = System.currentTimeMillis();
			log.debug(this.getClass(), "解析V3文件性能文件耗时:"
					+ (endTestTime - beginTestTime));
			busy = false;
		}
	}

	/**
	 * 入库
	 * 
	 * @throws DatabaseException
	 */
	private void insertDB() throws DatabaseException {
		try {
			// 按照表格记录归类
			/*
			 * Collection<List<GuideLineData>> values =
			 * recordOrientedMap.values(); for (List<GuideLineData>
			 * guidLineDataList : values) { insert(conn, guidLineDataList);
			 * guidLineDataList.clear(); }
			 */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -