原代码:
复制代码
1
2
3private ChannelSftp sftp; private Session sshSession;
- 上述代码导致多线程连接情况下,A线程的channel被B线程关闭
- 上述代码将channel放置到threadlocal,共享一个sesion创建多个channel,这样会导致seesion无法关闭,始终建立连接
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61private 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连接正常
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31lcom.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上传下载内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复