咨询关于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连接上后马上断网,但是系统并不会停。而拿出去的系统却有时会停。
大家遇到过这种情况吗?为什么会停呢?望大家解决
...全文
820 23 打赏 收藏 转发到动态 举报
写回复
用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)
内容概要:本文聚焦于“基于配电网韧性提升的应急移动电源预配置和动态调度”研究中的MPS预配置部分,属于SCI一区高水平论文的复现工作。通过Matlab编程实现,构建了面向极端事件下配电网快速恢复能力提升的优化模型,重点解决应急移动电源(MPS)在灾前的科学预配置问题。研究系统阐述了问题背景、建模逻辑与求解方法,强调科研过程中逻辑严谨性、借力高水平成果的重要性,并倡导在扎实基础上追求创新突破。资源包包含完整代码、数据及论文资料,支持读者复现结果并进一步开展动态调度等后续研究,对提升电力系统抗灾韧性具有重要的理论与实践价值。; 适合人群:具备电力系统分析、优化建模及Matlab编程基础的科研人员,特别适用于从事电网韧性、应急调度、微电网规划、综合能源系统等方向的硕士、博士研究生及高校研究人员。; 使用场景及目标:① 复现并深入理解SCI一区论文中关于MPS预配置的数学模型与算法实现;② 掌握利用Matlab进行电力系统应急优化仿真与韧性评估的技术方法;③ 探究应急电源空间配置与电网恢复性能间的量化关系,为实际电力系统防灾规划与调度决策提供理论依据和技术支撑。; 阅读建议:建议读者结合提供的网盘资源,按照文档结构循序渐进地学习,重点关注模型构建的物理意义、约束条件设定及Matlab代码的实现细节,务必动手运行与调试代码以加深理解。同时可参考团队发布的其他相关研究,拓展在智能优化算法、鲁棒调度等领域的综合应用能力。
内容概要:本文系统阐述了Private访问控制在芯片设计全生命周期中的实战应用,覆盖设计态、验证态、DFT态到制造态四大阶段,提出基于EDA工具链的四维防护体系。通过Synopsys Design Compiler约束脚本、UVM验证环境私有化配置以及Mentor Tessent DFT私有指令集实现,展示了如何在RTL设计、仿真验证、测试向量生成等关键环节实施精细化访问控制,有效防止IP泄露与非法调试。重点案例包括JTAG私有指令定义、扫描链信号隔离、测试向量AES-256加密及eFuse密钥保护机制,构建从硬件到流程的安全闭环。; 适合人群:从事芯片前端/后端设计、DFT开发、验证工程的技术人员,以及关注集成电路安全的架构师与项目管理人员,具备数字电路设计与EDA工具使用基础者更佳。; 使用场景及目标:①在芯片设计中实现IP核与敏感寄存器的访问隔离;②提升DFT测试安全性,防范通过JTAG接口进行的数据窃取;③构建企业级权限管理体系,支持多团队协作下的安全交付;④满足高安全等级芯片(如加密芯片、AI芯片)的合规性要求。; 阅读建议:此资源强调实战性,建议结合EDA工具实际操作相关脚本(TCL/UVM/SystemVerilog),重点关注私有指令设计、权限绑定与加密策略的集成应用,并在项目中评估安全与可测性的平衡,以实现高效可靠的安全闭环设计。

81,111

社区成员

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

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