2016-08-12 5 views
0

Поскольку создание соединения занимает довольно много раз, и я хотел бы подключиться к нескольким хостам, я начал использовать JSch из нескольких потоков.Если я использую JSch из более чем одного потока, как его использовать

Тем не менее, я получаю некоторые неприятные исключения, которые, я думаю, из-за того, что JSch не является потокобезопасным. Как следует использовать его, чтобы он не вызывал каких-либо исключений, что связано с не-потоковой безопасностью 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) 

обновление

В моем тесте я подключен к же хозяевах несколько раз. Вот почему я получил исключение.

+1

Я не думаю, что это исключение вызвано одновременным доступом. Скорее, сервер отклоняет слишком частые попытки подключения с одного и того же хоста (что довольно часто). Вы пытались подключиться с помощью нескольких параллельных экземпляров некоторых SSH/SFTP-клиентов, запущенных в тот же момент? –

+0

, если он не является потокобезопасным, вы можете использовать его только из одного потока, и большинство сокетов-клиентов * логически * представляют собой однопоточную операцию в любом случае. Один экземпляр Jsh представляет собой одно соединение, вы не можете обойти это. 10 соединений - 10 экземпляров. –

+0

Argh, извините за шум. Я сам выяснил, что @ martyn-prikryl написал в предыдущем комментарии: у меня есть дешевый тест, и действительно подключен к одному и тому же хозяину несколько раз. Теперь я переключился на подключение к нескольким хостам, и я проверил подключение к 20 хостам, и он работает без каких-либо исключений. Спасибо за ваш намек. – pihentagy

ответ

0

Как и любой другой небезопасный класс.

Доступ к нему из одной нити за один раз.

Используйте synchronized заявление:
https://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

Если это понижает производительность, вы можете создать пул соединений.


Хотя я не думаю, что это исключение вызвано одновременным доступом.

Это скорее то, что сервер отклоняет слишком частые попытки подключения с одного и того же хоста (что довольно часто встречается).

+0

Уверен, синхронизирован, но что я должен точно синхронизировать? – pihentagy

+0

Ну, любой доступ к экземпляру сеанса JSch .. –

+0

Хорошо, я добавил синхронизированный с com.jcraft.jsch.Session # openChannel и получил более 1 с задержки для каждого соединения :( Какова была идея пула соединений? Создание всех подключений заранее в фоновом потоке? – pihentagy