2016-08-12 33 views
0

接続の作成には数回かかるので、複数のホストに接続したいので、複数のスレッドから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) 

更新

私は同じホストに複数回接続されています。だから私は例外がある。

+1

この例外は同時アクセスが原因ではないと私は考えています。むしろ、サーバが同じホストから頻繁に接続を試みることを拒否することです(かなり一般的です)。同じ瞬間に起動したいくつかのSSH/SFTPクライアントの複数の並列インスタンスを使用して接続しようとしましたか? –

+0

スレッドセーフでない場合は、単一のスレッドからのみ使用でき、ほとんどのソケットクライアントは*論理的に*単一のスレッド操作を表します。 1つのJshインスタンスが1つの接続を表していますが、それを回避することはできません。 10接続は10インスタンスを意味します。 –

+0

ああ、雑音のために申し訳ありません。私は、@ martyn-prikrylが前のコメントで書いた、私が考え出した:私は安いテストを持っていて、実際には同じホストに複数回接続しています。今では複数のホストに接続することに切り替えました.20台のホストに接続することをテストしましたが、例外なく動作します。あなたのヒントをありがとう。 – pihentagy

答えて

0

他のスレッドセーフでないクラスです。

一度に1つのスレッドからのみアクセスしてください。

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

これがパフォーマンスをダウングレードする場合は、接続プールを作成することができます。


私は、この例外が同時アクセスによって引き起こされるとは思いませんが。

サーバーが同じホストからの接続試行を頻繁に拒否することがよくあります(かなり一般的です)。

+0

確かに同期されていますが、どうすれば正確に同期する必要がありますか? – pihentagy

+0

まあ、JSchセッションインスタンスへのアクセス.. –

+0

私はcom.jcraft.jsch.Session#openChannelに同期を追加し、すべての接続に対して1秒以上の遅延を得ました:( 接続プールの考え方は何ですか? – pihentagy

関連する問題