jsch的sftp在多线程下的问题及处理办法

jsch的sftp在多线程下的问题及处理办法,第1张

SftpUtil2 :

测试程序:

该程序使用多线程并发 *** 作闹棚sftp,在多线程中共用一个 ChannelSftp ,就会出异常,具体如下:

在 SftpUtil 中使用ThreadLocal包装ChannelSftp、Session保证线程安全。

在 Test3 中使用 parallelStream().forEach 完成多线程并发 *** 作 sftp 。

SftpUtil

Test3 :

使用单线程上传 1458 个文件,每个 500kb ,进行三次测试,平均耗时为: 68732 毫秒

使用多线程上传 1458 个文件,每个 500kb ,进行三次测试,平均耗时为: 67117 毫秒

通过测试,可以看到使液锋则用多线程 *** 作确实能提升效率,但是,其提升非常有限,却带来了较高的复杂性,在使用中更加建议通过单线程的方式。如果,需要将sftp封装成工基含具类供他人使用,需要提醒多线程并发的问题,或为了保险起见,也可以在sftp工具类中使用 ThreadLocal 包装 ChannelSftp 和 Session 。

首先这里需要介绍一个新朋友给大家,就是他JSch。

这里简单肆缺介绍一下JSch,他是是SSH2的一个纯Java实现。Java中可以通过使用JSch来连接到sshd 服务器上,并进行裂耐辩文件的下载删除上传等 *** 作。

2

JSch下载地址为可以直接百度一下。

找到Download,如图所示:

这里我们看到有两个可以下载的,一个是.zip,一个是.jar。

jsch-0.1.53.zip:为JSch的源码压缩包,有兴趣的码友可以下载下来研究一下。

jsch-0.1.53.jar:为JSch的编译好的jar包,开发时放到工程中即可。

这里我们就直接下载jsch-0.1.53.jar了。

END

JSch使用

我们将下载好的jsch-0.1.53.jar包放在我们的工程下方,并将jar包引入到工程中。

在工程中定义一个连接SFTP的类,这里我们定义为SFTPUtil.java。

大家可以根据自己需要进行定义。

首先我们需要在类中定义几个静态变量。

主机地址、端口号、用户名、密码

接下来我们定义链接亩铅到该服务器的方法名,这里命名该方法名为connect。

创建服务器连接的过程大致为一下几点:

1、创建session,将服务器地址信息放入session;

2、建立连接;

3、打开channel;

4、链接成功;

必须是可以的啊, 配合 jsch.jar(ftp文件上传使用) 使用。

Controller 源码中已经提供两个获取 批量上传的文件 方法

    public List<UploadFile> getFiles(String uploadPath, int maxPostSize) {

        if (request instanceof MultipartRequest == false)

            request = new MultipartRequest(request, uploadPath, maxPostSize)

        return ((MultipartRequest)request).getFiles()

    }

   滑枝 

    public List<UploadFile> getFiles(String uploadPath) {

        if (request instanceof MultipartRequest == false)

            request = new MultipartRequest(request, uploadPath)

        return ((MultipartRequest)request).getFiles()

    }

获取 到 List<UploadFile>文件集合之后, 再使用 jsch.jar 进行ftp文件上传到其他服务器

JSch jsch = new JSch()

        Session sshSession = 信芦敏jsch.getSession(this.username, this.host, this.port)

        sshSession.setPassword(password)

        Properties sshConfig = new Properties()

        sshConfig.put("StrictHostKeyChecking", "no")

        sshSession.setConfig(sshConfig)

    哗改    sshSession.connect(20000)

        Channel sftp = sshSession.openChannel("sftp")

        sftp.connect()

        。。。 这个百度搜一下,代码很多, 这里就不在啰嗦了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12124476.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存