咨询关于com.enterprisedt.net.ftp.FTPClient 在 Timer下使用的问题

zb_86 2008-01-17 05:28:39
我使用com.enterprisedt.net.ftp.FTPClient 到服务器用Timer定时下载数据处理,但当网络不好的时候出现了有时系统会停的异常情况,系统部署在Sunone9下。
程序代码如下:
try{
...
ftp.connect();
ftp.login(username, password);
ftp.setTimeout(Global.ftp_time_out);
ftp.setConnectMode(FTPConnectMode.PASV);
ftp.setType(FTPTransferType.BINARY);

...
ftp.chdir(remotepath);
String[] files = ftp.dir(".", false);
...
} catch(IOException e){
log.debug("[FTP Client]从FTP服务器下载文件失败。 ", e);
} catch(FTPException e){
...
} catch(Exception e){
...
} finally{
try {
if(ftp.connected()){
ftp.cancelTransfer();
ftp.quit();
log.info("[FTP Client]关闭FTP连接");
}
}catch (IOException e) {
e.printStackTrace();
}catch (FTPException e) {
e.printStackTrace();
}
}

系统停的时候打出的异常信息如下:
2007-11-15 15:15:16 DEBUG [FTP Client]从FTP服务器下载文件失败。
java.io.IOException: 同级重置连接
at sun.nio.ch.FileDispatcher.read0(Native Method)
at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:21)
at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:233)
at sun.nio.ch.IOUtil.read(IOUtil.java:206)
at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:207)
at com.sun.enterprise.server.ss.ASInputStream.read(ASInputStream.java:75)
at com.sun.enterprise.server.ss.ASInputStream.read(ASInputStream.java:66)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at com.enterprisedt.net.ftp.FTPControlSocket.readReply(FTPControlSocket.java:681)
at com.enterprisedt.net.ftp.FTPControlSocket.sendCommand(FTPControlSocket.java:649)
at com.enterprisedt.net.ftp.FTPClient.dir(FTPClient.java:2046)
at com.neusoft.lbmp.gas.processor.ftp.Clients.downloadAll(Clients.java:78)
at com.neusoft.lbmp.gas.processor.timer.SynProcessor.run(SynProcessor.java:42)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)

系统在网络不好的时候有时会出现这种情况,从日志上看,dir方法抛出IOException,但被捕获了。
一般情况下,系统在FTP连接上了后,如果此时网络断了,进入dir方法后,就会抛出这个异常,但是测试结果证明系统不会停。系统用Timer不停的跑
人为的断网可以比较容易的让系统出现这种异常情况,就是在ftp连接上后马上断网,但是系统并不会停。而拿出去的系统却有时会停。
大家遇到过这种情况吗?为什么会停呢?望大家解决
...全文
789 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
zb_86 2008-01-23
  • 打赏
  • 举报
回复
sunyujia 2008-01-22
  • 打赏
  • 举报
回复
看来你不能解决我的问题了。
1,我曾经也怀疑FTPClient会抛Throwable或者Error的异常,但是事实是它只抛了IOException异常,从日志看也被捕获了
2,你没看过FTPClient的源码吧?我看了,ftp.cancelTransfer()是不会抛异常的。并且在我写的代码外还有一层Exception捕获,我没写
3,Timer和quartz,不能说哪个好,只能说quartz配置起来能实现更多的定时问题。
4,系统停,就是说日志不往下打,也就是说Timer不执行或者说根本不被调用,我一直认为是ftp没有结束,所以Timer没有继续往下走

sunyujia,非常感谢你的参与!
如需解决,希望更加努力


你难到指望帮你回复问题的人去搭建环境模拟,并且去读源码吗?再说你看了源码为什么还搞不定.
quartz比你的timer好的地方多了去了,不仅仅是更多的定时问题,同时他很健壮.


今天心情不爽.
zb_86 2008-01-21
  • 打赏
  • 举报
回复
问题就在这了,timeout都设置了,可是当FTPClient去连接的时候,如果ip存在或者不存在,连不上的时候,超时就不好用了。
老紫竹 2008-01-21
  • 打赏
  • 举报
回复
我一直在使用一个远程备份软件,自己写的,定时的从服务器上采用http下载文件,断网或者发生异常时,我一般会放弃这次备份,等下一个时间周期。
老紫竹 2008-01-21
  • 打赏
  • 举报
回复
Socket 有一个setSoTimeout 参数,在连接超时没有反应时会产生异常。ftpclient 也应该有!

我想,无论哪种情况,只要是网断了,就应该马上停止。

然后根据策略选择重试,还是推出,等下一个Timer
zb_86 2008-01-21
  • 打赏
  • 举报
回复
看来你不能解决我的问题了。
1,我曾经也怀疑FTPClient会抛Throwable或者Error的异常,但是事实是它只抛了IOException异常,从日志看也被捕获了
2,你没看过FTPClient的源码吧?我看了,ftp.cancelTransfer()是不会抛异常的。并且在我写的代码外还有一层Exception捕获,我没写
3,Timer和quartz,不能说哪个好,只能说quartz配置起来能实现更多的定时问题。
4,系统停,就是说日志不往下打,也就是说Timer不执行或者说根本不被调用,我一直认为是ftp没有结束,所以Timer没有继续往下走

sunyujia,非常感谢你的参与!
如需解决,希望更加努力
hahe7788 2008-01-21
  • 打赏
  • 举报
回复
按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620
在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ
zb_86 2008-01-21
  • 打赏
  • 举报
回复
我试过很多次了,研究了很多天。问题就在这:
try{
if(ftp.connected()){ //1
ftp.cancelTransfer(); //2
ftp.quit(); //3
log.info("[FTP Client]关闭FTP连接"); //这个日志没有打
}
}catch(IOException e) {
e.printStackTrace(); //这也没有打
}catch(FTPException e) {
e.printStackTrace(); //这也没有打
}
外层还有Exception捕获,捕获到后这个Timer就执行完了,照常理肯定会进行下次执行了,但是却没有,说明系统死在1,2,3某处,我看过FTPClient源码,1和2都是执行简单的赋值,肯定是不会有问题的,我估计是quit方法的问题,具体分析详见2楼我阐述的。

你说的没错,系统肯定是和网络有关的,不是每次都会这样,也许运行了十多天,突然出现死了,目前我做测试也没办法模拟,郁闷。
老紫竹 2008-01-21
  • 打赏
  • 举报
回复
呵呵!我这里每次都好用,哈哈!

不知道是不是和你的网络环境有关。 你是不是在局域网里面啊!

你把所有的catch都去掉,抛出所有的异常,看看能不能检测到异常
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
Throwable 是最上面的一层异常比Exception要高,这个异常的出现就意味着系统不能正常运行了,不知道你的日志是你测试的时候抓的还是从客户哪拿的.也许问题根本不再哪,另外还需再描述下是timer停了还是 ftp程序连接不上了.系统停了谁知道那个停了,另外不理解为什么不用quartz.jar要自己写timer

dir方法抛了异常
因为有finally
所以会执行
ftp.cancelTransfer(); 但如果这个也抛了异常
ftp.quit(); 就没法执行了
因为没写过不知道cancelTransfer会不会抛所以算猜想吧.

你的日志可以在贴些就凭一个异常信息不好判断吧.
zb_86 2008-01-20
  • 打赏
  • 举报
回复
我觉得不是异常的事,异常早被IOException捕获了,更何况外面还有一层Exception。
希望大虾们好好看看我写的,帮我解决一下,感激不尽!
sunyujia 2008-01-20
  • 打赏
  • 举报
回复
你是想让系统出现问题时不停是吗
Throwable
捕获这个异常
l_wenb 2008-01-19
  • 打赏
  • 举报
回复
只能帮顶!看了,不是很理解!

LZ认真调试 !思路理清楚!
zb_86 2008-01-18
  • 打赏
  • 举报
回复
顶,高手赐教阿
waterborn 2008-01-18
  • 打赏
  • 举报
回复
看不懂 , FTP 没遇到过这种问题.
zb_86 2008-01-18
  • 打赏
  • 举报
回复
顶,高手,挑战难度阿!
zb_86 2008-01-18
  • 打赏
  • 举报
回复
顶,高高手速来帮忙啊!
zb_86 2008-01-18
  • 打赏
  • 举报
回复
我继续详细的阐述一下系统停的现象:系统在人为断网的情况下不一定会停,也就是说系统在网络不好的情况下有时停有时不停。
前两天我个人分析是这样的:1,ftp连接成功后,进入dir方法,如果此时网络断了,就会出现上述异常情况,但此时系统不会停;
2,ftp连接成功后,dir方法的时候网络断了,出现异常,进入quit方法时,网络又好了,分析源码,quit和dir方法里有一个通用的sendCommand方法,它会一直等待服务器端回的流,对于网络断,肯定会抛异常,然后返回;网络好了,就会一直等,如果服务器端此时并不回任何东西,也许它就会一直等下去。

虽然我个人的分析可以解释,但总觉得不可靠,希望遇到过或了解的大哥大姐们帮帮小弟,急啊!
zhangli0803 2008-01-18
  • 打赏
  • 举报
回复
帮顶!!!
zhangli0803 2008-01-18
  • 打赏
  • 举报
回复
帮顶!
加载更多回复(1)

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧