pihentagy pihentagy - 3 months ago 56
Java Question

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

Since connection creation takes up quite a few times, and I'd like to connect to multiple hosts, I started to use JSch from multiple threads.

However I get some nasty exceptions, which I think is because of JSch being not thread-safe. How should I use it, that it not throws any exception, which is due to the not-thread-safety of JSch?

Stacktrace:

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)


update



In my test I connected to the same host multiple times. That's why I got the exception.

Answer

As any other non-thread safe class.

Access it from a single thread at a time only.

Use synchronized statement:
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

If this downgrades performance, you can create a connection pool.


Though I do not think this exception is caused by concurrent access.

It's rather that the server rejects too frequent connection attempts from the same host (what is quite common).