如果我从多个线程中使用 JSch,我应该如何使用它
Posted
技术标签:
【中文标题】如果我从多个线程中使用 JSch,我应该如何使用它【英文标题】:If I use JSch from more than one thread, how should I use it 【发布时间】:2016-08-12 10:00:56 【问题描述】:由于创建连接占用了很多次,而且我想连接到多个主机,我开始从多个线程中使用 JSch。
但是我得到了一些令人讨厌的异常,我认为这是因为 JSch 不是线程安全的。我应该如何使用它,它不会抛出任何异常,这是由于 JSch 的非线程安全性?
堆栈跟踪:
com.jcraft.jsch.JSchException: connection is closed by foreign host
at com.jcraft.jsch.Session.connect(Session.java:269)
at com.jcraft.jsch.Session.connect(Session.java:183)
at com.ericsson.eea.ark.test.common.ssh.JschSshContext.session$lzycompute(JschSshContext.scala:64)
更新:在我的测试中,我多次连接到 same 主机。这就是我得到异常的原因。
【问题讨论】:
【参考方案1】:与任何其他非线程安全类一样。
一次只能从一个线程访问它。
使用synchronized
声明:https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
如果这会降低性能,您可以创建一个连接池。
虽然我不认为这个异常是由并发访问引起的。
服务器拒绝来自同一主机的过于频繁的连接尝试(这很常见)。
【讨论】:
【参考方案2】:只是为了补充@Martin Prikryl 的回答,它实际上解决了我的问题。
在我的情况下,服务器不允许超过 20 个同时连接。花了 4 个小时后,我终于与基础架构团队进行了交谈,他们将 Linux 服务器上的最大 SSH 连接数增加到 50。
为了记录,步骤是(您需要在服务器上具有 root 访问权限):
编辑/etc/ssh/sshd_config
文件并将MaxSessions
参数设置为50
连接(在我的例子中)。
在同一文件中将MaxStartups
参数设置为50/30/50
。
重启SSH服务(或者重启整个盒子)。
【讨论】:
以上是关于如果我从多个线程中使用 JSch,我应该如何使用它的主要内容,如果未能解决你的问题,请参考以下文章