日期:2014-05-18  浏览次数:20809 次

咨询关于com.enterprisedt.net.ftp.FTPClient 在 Timer下使用的问题
我使用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连接上后马上断网,但是系统并不会停。而拿出去的系统却有时会停。
大家遇到过这种情况吗?为什么会停呢?望大家解决


------解决方案--------------------
你是想让系统出现问题时不停是吗
Throwable
捕获这个异常
------解决方案--------------------
Socket 有一个setSoTimeout 参数,在连接超时没有反应时会产生异常。ftpclient 也应该有!

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

然后根据策略选择重试,还是推出,等下一个Timer