本人菜鸟,这个问题排查了三天, 做下记录
这边需求是做一个归档操作,细节就不说了,大体就是到某个节点,将文件传到FTP上,然后定时从FTP上获取已经办结完的文件, 下载到某一个节点的服务器上 转成PDF。完成一系列的归档操作
现场出现这么个问题:环境是分布式部署,FTP和服务器均是linux,down文件时,文件均为空
首先是PDF。因为PDF不涉及与FTP的交互,是本地文件进行转换处理,首先是报了jacob.jar调用失败,经过上网搜索,发现jacob.jar只能应用于windows环境,后来换成了openoffice服务,结果一问现场,发现现场人家之前旧归档用的就是openoffice
囧。
html转PDF这边报了Can't connect to X11 window server服务的问题,我们公司的中间件是基于jetty封装的,因此我们这边需要在jetty 启动文件引用的变量中填写-Djava.awt.headless=true,问题就解决了。虽然短短几行,但是也解决了好久,留着以后看
o(╥﹏╥)o
通过排查发现,这边是在某一个固定节点进行了套红的处理,并且根据中文名比对,我看了下现场的流程,并没有交套红的节点,让其修改,本以为就可以了,但是,事事哪有那么简单
ftp down下的文件为空文件,路径没有问题,代码方面这边有两个位置进行了ftp下载的操作,我让现场先办理到第一个节点的位置,看一下文件,文件是正常的,到了第二个节点,就出现了问题,因此问题锁定到了第二个节点,但是发现代码没有任何问题
粘出代码供大家研究
private void ftpConfigInit() throws Exception {
ConfigXMLReader cmr = new ConfigXMLReader();
String server = cmr.getAttribute("FtpServer", "server");
int port = Integer.valueOf(cmr.getAttribute("FtpServer", "port"));
String user = cmr.getAttribute("FtpServer", "user");
String password = cmr.getAttribute("FtpServer", "password");
// 系统密码默认加入此字符串
password = password + "whir?!";
int reply;
ftpClient = new FTPClient();
ftpClient.connect(server, port);
// 如果采用默认端口,可以使用ftp.connect(url)的方式直接连接FTP服务器
ftpClient.login(user, password);// 登录
reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
ftpClient.disconnect();
logger.error("ftp连接失败!");
}
}
private void processFtpFile(String fileName, String remotePath,
String newFilePath) throws Exception {
logger.error("进行FTP生成正式文件");
OutputStream is = null;
try {
if (ftpClient == null || !ftpClient.isConnected()) {
ftpConfigInit();
}
if (ftpClient != null && ftpClient.isConnected()) {
ftpClient.changeWorkingDirectory(remotePath);// 转移到FTP服务器目录
ftpClient.enterLocalPassiveMode();
FTPFile[] fs = ftpClient.listFiles();
for (FTPFile ff : fs) {
logger.error("ff.getName:"+ff.getName());
logger.error("fileName:"+fileName);
if (ff.getName().equals(fileName)) {
File localFile = new File(newFilePath);
if (!localFile.getParentFile().exists()
|| !localFile.getParentFile().isDirectory()) {
localFile.getParentFile().mkdirs();
}
if (!localFile.exists()) {
localFile.createNewFile();
}
is = new FileOutputStream(localFile);
logger.error("ftp上传文件"+ff.getName());
ftpClient.retrieveFile(ff.getName(), is);
is.close();
break;
}
}
ftpClient.logout();
}
} catch (IOException e) {
e.printStackTrace();
if (this.ftpClient.isConnected())
try {
this.ftpClient.disconnect();
} catch (IOException localIOException1) {
}
if (is != null)
try {
is.close();
} catch (IOException e1) {
e1.printStackTrace();
}
} finally {
if (this.ftpClient.isConnected())
try {
this.ftpClient.disconnect();
} catch (IOException localIOException2) {
}
if (is != null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
排查许久,上网找资料。后来比对了可以正常下载ftp文件的代码,发现,是少了两行
ftpClient.setControlEncoding("UTF-8");
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
添加上去以后,就可以正常下载到本地了。所以我想知道down不下来的具体原因,请大牛指教