测试程序:
该程序使用多线程并发 *** 作闹棚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()
。。。 这个百度搜一下,代码很多, 这里就不在啰嗦了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)