jsch利用java实现了ssh的功能,具体资料可参考官网http://www.jcraft.com/jsch/。
我在项目中使用了jsch中的sftp功能,在get文件时使用如下方式:
ChannelSftp.get(src, dst, new MyProgressMonitor())
ChannelSftp的使用网上有很多。其中src是源文件,dst是目标文件,MyProgressMonitor是自定义的基础监控类:
package com.cmb.ccrm.etl.load.util;
import javax.swing.ProgressMonitor;
import org.apache.log4j.Logger;
import com.jcraft.jsch.SftpProgressMonitor;
/**
* SFTP上传下载进度监控类,简单实现了SftpProgressMonitor接口,该接口中有三个方法
* init():当文件开始传输时,调用init方法。
* count(): 当每次传输了一个数据块后,调用count方法,count方法的参数为这一次传输的数据块大小。
* end(): 当传输结束时,调用end方法。
* @author com.cmb.ccrm.ftp.jsch
*/
public class MyProgressMonitor implements SftpProgressMonitor {
private static final Logger logger = Logger.getLogger(MyProgressMonitor.class);
private ProgressMonitor monitor;
private long count = 0;
private long max = 0;
private long percent = -1;
public void init(int op, String src, String dest, long max) {
this.max = max;
monitor = new ProgressMonitor(null, ((op == SftpProgressMonitor.PUT) ? "put" : "get") + ": " + src,
"", 0, (int) max);
count = 0;
percent = -1;
monitor.setProgress((int) this.count);
monitor.setMillisToDecideToPopup(1000);
}
public boolean count(long count) {
this.count += count;
if (percent >= this.count * 100 / max) {
return true;
}
percent = this.count * 100 / max;
monitor.setNote("Completed " + this.count + "(" + percent + "%) out of " + max + ".");
monitor.setProgress((int) this.count);
logger.info(monitor.getNote());
return !(monitor.isCanceled());
}
public void end() {
monitor.close();
}
}
在windows测试时一直没有问题,上线时部署到linux服务器上,在get文件时,每次get了一秒就会报异常。刚开始只捕捉了JschException和SftpException,异常内容一直显示不了,后来将捕捉异常扩大到Exception,发现异常是java.awt.HeadlessException。经过检查,发现是监控类是基于awt实现的,在linux下无法弹出对话框,所以出现异常,去除之后就好了。