jsch包中Sftp连接问题

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下无法弹出对话框,所以出现异常,去除之后就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值