我是靠谱客的博主 重要仙人掌,最近开发中收集的这篇文章主要介绍多线程下实现SFTP上传下载,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

原代码:

    private   ChannelSftp sftp;
    private   Session sshSession;
  • 上述代码导致多线程连接情况下,A线程的channel被B线程关闭
  • 上述代码将channel放置到threadlocal,共享一个sesion创建多个channel,这样会导致seesion无法关闭,始终建立连接

    private static final ThreadLocal<ChannelSftp> CHANNEL_THREAD_LOCAL = new ThreadLocal<>();
    private static final ThreadLocal<Session> SESSION_THREAD_LOCAL = new ThreadLocal<>();

    /**
     * 初始化
     *
     */
    public static void init(SftpProperties properties) {
            String host = properties.getHost();
            JSch jsch = new JSch();
        try {
            Session sshSession = jsch.getSession(properties.getUsername(), properties.getHost(), properties.getPort());
            sshSession.setPassword(properties.getPassword());
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            ChannelSftp channel = (ChannelSftp) sshSession.openChannel("sftp");
            channel.connect(5000);
            if (log.isInfoEnabled()) {
                log.info("sftp connected to " + host + ".");
            }
            CHANNEL_THREAD_LOCAL.set(channel);
            SESSION_THREAD_LOCAL.set(sshSession);
            log.info("当前{}线程的sftp初始化 ,session:{},channel:{}",Thread.currentThread().getName(),sshSession,channel);
        } catch (Exception e) {
            log.error("sftp connected fail to " + host + ".");
            e.printStackTrace();
            throw new ServiceException("sftp 连接异常:"+e.toString());
        }
    }


    public static void disconnect() {
        ChannelSftp channel = CHANNEL_THREAD_LOCAL.get();
        if (channel != null && channel.isConnected()) {
            channel.disconnect();
        }
        Session session = SESSION_THREAD_LOCAL.get();
        if (session != null && session.isConnected()) {
            session.disconnect();
        }
        log.info("当前{}线程的session执行关 ,session:{},channel{}",Thread.currentThread().getName(),session,channel);
        CHANNEL_THREAD_LOCAL.remove();
        SESSION_THREAD_LOCAL.remove();
    }


    public static InputStream downloadStream(String sourcePath, String fileName) throws SftpException {
        ChannelSftp channelSftp =  CHANNEL_THREAD_LOCAL.get();
        String filePath = sourcePath + fileName;
        try {
            return channelSftp.get(filePath);
        } catch (SftpException e) {
            log.error("====Download inputStream fail :" + sourcePath + fileName, e);
            throw e;
        }
    }

  • 压测下20连接正常
    在这里插入图片描述
lcom.jcraft.jsch.ChannelSftp@2a79cdb5
2022-06-29 14:51:29.349  INFO 2664 --- [io-8090-exec-37] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.349  INFO 2664 --- [io-8090-exec-38] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.349  INFO 2664 --- [io-8090-exec-37] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-37线程的sftp初始化 ,session:com.jcraft.jsch.Session@17b545c3,channel:com.jcraft.jsch.ChannelSftp@52b7c951
2022-06-29 14:51:29.350  INFO 2664 --- [io-8090-exec-38] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-38线程的sftp初始化 ,session:com.jcraft.jsch.Session@4a90582,channel:com.jcraft.jsch.ChannelSftp@41ab9b73
2022-06-29 14:51:29.376  INFO 2664 --- [io-8090-exec-46] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-46线程的session执行关 ,session:com.jcraft.jsch.Session@54a2d9a0,channelcom.jcraft.jsch.ChannelSftp@5a653d44
2022-06-29 14:51:29.407  INFO 2664 --- [io-8090-exec-39] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.407  INFO 2664 --- [io-8090-exec-39] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-39线程的sftp初始化 ,session:com.jcraft.jsch.Session@747a7f84,channel:com.jcraft.jsch.ChannelSftp@3178ef6f
2022-06-29 14:51:29.461  INFO 2664 --- [io-8090-exec-38] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-38线程的session执行关 ,session:com.jcraft.jsch.Session@4a90582,channelcom.jcraft.jsch.ChannelSftp@41ab9b73
2022-06-29 14:51:29.461  INFO 2664 --- [io-8090-exec-37] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-37线程的session执行关 ,session:com.jcraft.jsch.Session@17b545c3,channelcom.jcraft.jsch.ChannelSftp@52b7c951
2022-06-29 14:51:29.471  INFO 2664 --- [io-8090-exec-40] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.471  INFO 2664 --- [io-8090-exec-40] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-40线程的sftp初始化 ,session:com.jcraft.jsch.Session@6673547a,channel:com.jcraft.jsch.ChannelSftp@2371d6d0
2022-06-29 14:51:29.485  INFO 2664 --- [io-8090-exec-41] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.485  INFO 2664 --- [io-8090-exec-41] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-41线程的sftp初始化 ,session:com.jcraft.jsch.Session@7cbb05a0,channel:com.jcraft.jsch.ChannelSftp@39b98453
2022-06-29 14:51:29.520  INFO 2664 --- [io-8090-exec-39] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-39线程的session执行关 ,session:com.jcraft.jsch.Session@747a7f84,channelcom.jcraft.jsch.ChannelSftp@3178ef6f
2022-06-29 14:51:29.553  INFO 2664 --- [io-8090-exec-42] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.553  INFO 2664 --- [io-8090-exec-47] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.553  INFO 2664 --- [io-8090-exec-42] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-42线程的sftp初始化 ,session:com.jcraft.jsch.Session@e05db62,channel:com.jcraft.jsch.ChannelSftp@4b0744c6
2022-06-29 14:51:29.553  INFO 2664 --- [io-8090-exec-47] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-47线程的sftp初始化 ,session:com.jcraft.jsch.Session@1d4f4216,channel:com.jcraft.jsch.ChannelSftp@1388bfcf
2022-06-29 14:51:29.584  INFO 2664 --- [io-8090-exec-40] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-40线程的session执行关 ,session:com.jcraft.jsch.Session@6673547a,channelcom.jcraft.jsch.ChannelSftp@2371d6d0
2022-06-29 14:51:29.607  INFO 2664 --- [io-8090-exec-41] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-41线程的session执行关 ,session:com.jcraft.jsch.Session@7cbb05a0,channelcom.jcraft.jsch.ChannelSftp@39b98453
2022-06-29 14:51:29.657  INFO 2664 --- [io-8090-exec-48] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.658  INFO 2664 --- [io-8090-exec-48] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-48线程的sftp初始化 ,session:com.jcraft.jsch.Session@3d660d1,channel:com.jcraft.jsch.ChannelSftp@30305491
2022-06-29 14:51:29.725  INFO 2664 --- [io-8090-exec-47] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-47线程的session执行关 ,session:com.jcraft.jsch.Session@1d4f4216,channelcom.jcraft.jsch.ChannelSftp@1388bfcf
2022-06-29 14:51:29.725  INFO 2664 --- [io-8090-exec-42] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-42线程的session执行关 ,session:com.jcraft.jsch.Session@e05db62,channelcom.jcraft.jsch.ChannelSftp@4b0744c6
2022-06-29 14:51:29.730  INFO 2664 --- [io-8090-exec-43] com.zhanghao.base.util.VcSftpUtil        : sftp connected to 10.139.60.132.
2022-06-29 14:51:29.730  INFO 2664 --- [io-8090-exec-43] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-43线程的sftp初始化 ,session:com.jcraft.jsch.Session@6c9c5e42,channel:com.jcraft.jsch.ChannelSftp@299ecdb5
2022-06-29 14:51:29.826  INFO 2664 --- [io-8090-exec-48] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-48线程的session执行关 ,session:com.jcraft.jsch.Session@3d660d1,channelcom.jcraft.jsch.ChannelSftp@30305491
2022-06-29 14:51:29.889  INFO 2664 --- [io-8090-exec-43] com.zhanghao.base.util.VcSftpUtil        : 当前http-nio-8090-exec-43线程的session执行关 ,session:com.jcraft.jsch.Session@6c9c5e42,channelcom.jcraft.jsch.ChannelSftp@299ecdb5

最后

以上就是重要仙人掌为你收集整理的多线程下实现SFTP上传下载的全部内容,希望文章能够帮你解决多线程下实现SFTP上传下载所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(32)

评论列表共有 0 条评论

立即
投稿
返回
顶部