📄 scanv3perdatafile.java
字号:
/**
* @(#)ScanPerDataFileProcess.java Nov 3, 2006 3:13:25 PM
*
* COPYRIGHT DaTang Mobile Communications Equipment CO.,LTD
*/
package com.datangmobile.oss.omc.pc.v3file;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.datangmobile.oss.omc.common.exception.FTPException;
import com.datangmobile.oss.omc.common.exception.NeaException;
import com.datangmobile.oss.omc.pc.PmContext;
import com.datangmobile.oss.omc.pc.ParseFileQueue;
import com.datangmobile.oss.omc.pc.PmConst;
import com.datangmobile.oss.omc.pc.util.FileInfo;
import com.datangmobile.oss.omc.pc.util.FileParserUtil;
import com.datangmobile.oss.platform.util.FTPFileInfo;
import com.datangmobile.oss.platform.util.FTPInfo;
import com.datangmobile.oss.platform.util.ILogger;
import com.datangmobile.oss.platform.util.ModuleLogger;
import cz.dhl.ftp.Ftp;
import cz.dhl.ftp.FtpConnect;
import cz.dhl.ftp.FtpFile;
import cz.dhl.io.CoFile;
import cz.dhl.io.CoLoad;
import cz.dhl.io.LocalFile;
/**
* 论询文件处理类
*
* @author liuyuan
* @version 1.0
*
* CNBUG00018019 由于性能数据文件为zip格式,导致解析时出现内存溢出异常
* @author liuyuan
* @version 1.1
*
* CRMCN00003777 2008-5-29 多版本管理 需要加入网元dn,以判断网元的版本号
* @author liuyuan
* @version 1.2
*/
public class ScanV3PerDataFile {
private FtpConnect cn;
private Ftp cl;
private String user;
private String passwd;
private String ftpserverip;
private String path;
/**
* 用于记录原始路径
*/
private String rootPath;
/**
* 日志记录器
*/
private static final ILogger log = ModuleLogger.getPmLogger()
.getOperLogger();
private static ScanV3PerDataFile scanV3PerDataFile = new ScanV3PerDataFile();
/**
* 单例类
*
* @return
*/
public static ScanV3PerDataFile getInstance() {
return scanV3PerDataFile;
}
/**
* 初始化得到连接ftp服务器的配置信息
*
* @throws NeaException
*
*/
private void init() throws FTPException {
try {
// 获取FTP的地址
FTPInfo ftpInfo = PmContext.getPmContext().createFtpInfo();
ftpserverip = ftpInfo.getIP();
user = ftpInfo.getUser();
passwd = ftpInfo.getPassword();
path = PmConst.PM_DIR + File.separator;
//xingyong 2008-11-11 在windows单机版的jboss无法解析文件
//所以需要对windows特殊处理
String osName = System.getProperty("os.name");
if(osName.startsWith("Windows")){
path = PmConst.PM_DIR + "/";
}
cn = FtpConnect.newConnect("ftp://" + ftpserverip);
cn.setUserName(user);
cn.setPassWord(passwd);
} catch (Exception e) {
throw new FTPException(
"init v3 ftpinfo from cmsever occurs errors!", e);
}
}
/**
* 扫描FTP服务器目录path 返回目录下文件的信息
*
* @param path
* @return
*/
private FTPFileInfo[] scanFTPServer(String path) throws FTPException {
FTPFileInfo[] infos = null;
try {
rootPath = cl.pwd();
/* 到ftp服务器指定工作目录下 */
if (!cl.cd(path)) {
log.error(ScanV3PerDataFile.class, "cannot find Dir: " + path
+ " in FTP: " + ftpserverip);
return null;
}
/* get current directory */
CoFile dir = new FtpFile(cl.pwd(), cl);
/* list & print current directory */
if (dir != null) {
CoFile fls[] = dir.listCoFiles();
infos = new FTPFileInfo[fls.length];
for (int i = 0; i < fls.length; i++) {
infos[i] = new FTPFileInfo();
infos[i].setDirectory(fls[i].isDirectory());
infos[i].setLastModifiedDate(fls[i].lastModifiedString());
infos[i].setName(fls[i].getName());
infos[i].setSize(fls[i].length());
}
}
} catch (Exception e) {
throw new FTPException(
"Get v3 files info from ftp server occurs error! "
+ ftpserverip);
}
return infos;
}
/**
* 对文件列表进行判断,返回符合性能数据文件名格式要求的
*
* @param fileinfo
* @return
*/
private String[] getPerDataFiles(FTPFileInfo[] fileinfo) {
if (fileinfo == null) {
return null;
}
List<String> filenames = new ArrayList<String>();
for (int i = 0; i < fileinfo.length; i++) {
/* 符合要求的文件返回 */
if (!fileinfo[i].isDirectory()
&& isV3PerData(fileinfo[i].getName())) {
filenames.add(fileinfo[i].getName());
}
}
String[] names = new String[filenames.size()];
filenames.toArray(names);
return names;
}
/**
* 性能数据文件名 pm20080617_rnc_1030.dat or zip<br>
* 小区对文件名 cellho_0002_20080617_1030.dat or zip
*
* @param filename
* @return
*/
public boolean isV3PerData(String filename) {
// 小区对的文件一定会解析
String[] s = filename.split(PmConst.PM_DATA_FILE_SEPARATOR);
// 小区对的文件
if ((s.length == 4)
&& s[0].startsWith(PmConst.PM_V3_CDL_FILE_PREFIX)
&& (filename.endsWith(PmConst.PM_DAT) || filename
.endsWith(PmConst.PM_ZIP))) {
return true;
}
if (PmContext.getPmContext().isParseDataFile()) {// 解析v3、v2数据文件
/*
* 3.40.30的文件格式和4.00.00的文件格式不一样, 3.40.30:pm20080617_rnc_1030.dat
* 4.00.00:pm_rnc_0012_2008901_0045.dat
*/
if ((s.length == 3 || s.length == 5)
&& s[0].startsWith(PmConst.PM_V3_DATA_FILE_PREFIX)
&& (filename.endsWith(PmConst.PM_ZIP) || filename
.endsWith(PmConst.PM_DAT))) {
/* 第二个字段为规定的网元类型 */
if (s[1].startsWith(PmConst.NETYPE_RNC)
|| s[1].startsWith(PmConst.NETYPE_MSCS)
|| s[1].startsWith(PmConst.NETYPE_GGSN)
|| s[1].startsWith(PmConst.NETYPE_SGSN)
|| s[1].startsWith(PmConst.NETYPE_MGW)
|| s[1].startsWith(PmConst.NETYPE_HLR)
|| s[1].startsWith(PmConst.NETYPE_NODEB)) {
return true;
}
}
}
return false;
}
/**
* 下载文件
*
* @param file
* @return
*/
public boolean downLoadFile(String file) throws FTPException {
boolean ret = false;
cl.cd(rootPath);
// source file local file
CoFile local = new LocalFile(path + file);
// 如果给的本地文件路径是temp\\dest\\1.wav
// 在在创建该文件的时候,还需要创建该文件的parent(一个dir)
File parent = ((LocalFile) local).getParentFile();
if (parent != null && !parent.exists())
parent.mkdirs();
CoFile svrFile = new FtpFile(path + file, cl);
// 从服务器上下载文件
ret = CoLoad.copy(local, svrFile);
return ret;
}
/**
* 删除ftp服务器文件 FTP的当前目录是性能数据文件保存的目录,所以file为直接的文件名
*
* @param file
* @return
* @throws FTPException
*/
private boolean deleteServerFile(String file) throws FTPException {
boolean ret = false;
try {
cl.cd(path);
ret = cl.rm(file);
return ret;
} catch (Exception e) {
log
.error(
"Delete v3 perdata file on ftp Server perdata file occurs errors!",
e);
if (cl != null) {
cl.disconnect();
}
throw new FTPException("delete v3 file " + file
+ " from ftp server occurs errors!" + ftpserverip);
}
}
/**
* 执行扫描 判断 下载任务
*
* @throws FTPException
* @throws IOException
*/
public void scanV3FileTask() throws Throwable {
try {
// 初始化
init();
try {
cl = new Ftp();
cl.getContext().setConsole(null);
cl.connect(cn);
} catch (Exception e) {
throw new FTPException("connect ftp server occurs errors!"
+ ftpserverip, e);
}
FTPFileInfo[] ftpFileInfo = scanFTPServer(path);
String[] files = getPerDataFiles(ftpFileInfo);
/* 如果轮询之后没有性能数据文件,则返回 */
if (files == null || files.length == 0) {
return;
}
for (String str : files) {
if (downLoadFile(str)) {
/* 下载后,如果删除ftp服务器文件出现异常,则需要把本地的文件也要删除 */
if (!deleteServerFile(str)) {
new File(path + str).delete();
} else {
/* 把成功下载的文件名加入解析队列中 */
String[] s = str.split("_");
String netype = s[1].toUpperCase();
/* 把成功下载的文件名加入解析队列中 */
String fileType = "";
if (str.startsWith(PmConst.PM_V3_DATA_FILE_PREFIX)) {// 性能统计上报文件
fileType = PmConst.PM_V3_DATA_FILE;
} else if (str
.startsWith(PmConst.PM_V3_CDL_FILE_PREFIX)) {// 小区对上报文件
fileType = PmConst.PM_V3_CDL_FILE;
}
// add by liuyuan 2008-3-21 加入对性能数据文件的处理(zip格式)
// CNBUG00018019
if (str.endsWith(PmConst.PM_ZIP)) {// 压缩文件
File dir = new File(System.getProperty("user.dir")
+ File.separator + PmConst.PM_DIR);
try {
ArrayList<String> pmFiles = FileParserUtil
.unzipFile(dir.getAbsolutePath()
+ File.separator, str);
for (String string : pmFiles) {
FileInfo fileinfo = new FileInfo();
String t = string.substring(string
.lastIndexOf(File.separator) + 1);
fileinfo.setFile(new File(path + t));
fileinfo.setFileType(fileType);
// 是V3数据文件才需设置NeType、Dn属性,而V3小区对文件则不需要
if (PmConst.PM_V3_DATA_FILE
.equals(fileType)) {
fileinfo.setNeType(netype);
fileinfo.setDn(FileParserUtil
.getNeDn(t));
}
// 将这些info发如待解析的队列中
ParseFileQueue.getInstance().putParseFile(
fileinfo);
}
new File(path + str).delete();
} catch (IOException e) {
log.error("解压文件到PM目录失败!" + str, e);
}
} else {// 可直接解析的二进制文件
FileInfo fileinfo = new FileInfo();
fileinfo.setFile(new File(path + str));
fileinfo.setFileType(fileType);
// 是V3数据文件才需设置NeType、Dn属性,而V3小区对文件则不需要
if (PmConst.PM_V3_DATA_FILE.equals(fileType)) {
fileinfo.setNeType(netype);
fileinfo.setDn(FileParserUtil.getNeDn(str));
}
// 将这些info发如待解析的队列中
ParseFileQueue.getInstance().putParseFile(fileinfo);
}
}
} else {// 下载失败
throw new FTPException("download v3 file " + str
+ " from ftp server occurs errors!" + ftpserverip);
}
}
} catch (Throwable e) {
throw new Throwable(e.getMessage(), e);
} finally {
if (cl != null) {
cl.disconnect();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -