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

时间:2016-08-12 10:00:56

标签: java concurrency jsch

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

更新

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

2 个答案:

答案 0 :(得分:2)

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

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

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

如果降低性能,可以创建连接池。

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

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

答案 1 :(得分:0)

只需补充实际上解决了我问题的@Martin Prikryl答案即可。

在我的情况下,服务器不允许同时进行20个以上的连接。花了4个小时之后,我终于与基础架构团队进行了交谈,他们将Linux服务器上的最大SSH连接数增加到50。

为进行记录,步骤如下(您需要在服务器上具有root用户访问权限):

  1. 编辑/etc/ssh/sshd_config文件,并将MaxSessions参数设置为50连接(在我的情况下)。

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

  3. 重新启动SSH服务(或重新启动整个框)。