如果我从多个线程使用 JSch,我应该如何使用它

If I use JSch from more than one thread, how should I use it

由于创建连接占用了很多时间,而且我想连接到多个主机,所以我开始从多线程使用 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)

更新:在我的测试中,我多次连接到同一个主机。这就是我得到例外的原因。

与任何其他非线程安全的一样class。

一次只能从一个线程访问它。

使用synchronized语句:
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

如果这会降低性能,您可以创建一个连接池。


虽然我不认为这个异常是由并发访问引起的。

服务器拒绝来自同一主机的过于频繁的连接尝试(这是很常见的)。

只是为了补充@Martin Prikryl 的回答,实际上解决了我的问题。

在我的例子中,是服务器不允许同时连接超过 20 个。花了 4 个小时后,我终于与基础架构团队交谈,他们将 Linux 服务器上的最大 SSH 连接数增加到 50。

作为记录,步骤是(您需要在服务器上具有 root 访问权限):

  1. 编辑 /etc/ssh/sshd_config 文件并将 MaxSessions 参数设置为 50 连接(在我的例子中)。

  2. 在同一文件中将 MaxStartups 参数设置为 50/30/50

  3. 重启SSH服务(或者重启整个盒子)