SFTP セッションファクトリ

バージョン 3.0 の時点で、セッションはデフォルトでキャッシュされなくなりました。SFTP セッションキャッシングを参照してください。

SFTP アダプターを構成する前に、SFTP セッションファクトリを構成する必要があります。次の例に示すように、SFTP セッションファクトリを通常の Bean 定義で構成できます。

<beans:bean id="sftpSessionFactory"
    class="org.springframework.integration.sftp.session.DefaultSftpSessionFactory">
    <beans:property name="host" value="localhost"/>
    <beans:property name="privateKey" value="classpath:META-INF/keys/sftpTest"/>
    <beans:property name="privateKeyPassphrase" value="springIntegration"/>
    <beans:property name="port" value="22"/>
    <beans:property name="user" value="kermit"/>
</beans:bean>

アダプターが SessionFactory からセッションオブジェクトをリクエストするたびに、新しい SFTP セッションが作成されます。裏では、SFTP Session Factory は Apache MINA SSHD (英語) ライブラリに依存して SFTP 機能を提供します。

ただし、Spring Integration は SFTP セッションのキャッシュもサポートしています。詳細については、SFTP セッションキャッシングを参照してください。

DefaultSftpSessionFactory は、外部構成または拡張 SshClient を使用できます。例: org.eclipse.jgit:org.eclipse.jgit.ssh.apache ライブラリの org.eclipse.jgit.internal.transport.sshd.JGitSshClient 拡張を使用して、HTTP/SOCKS プロキシのサポートを提供できます。

SshClient は、サーバーへの接続を介して複数のチャネル (操作) をサポートします。デフォルトでは、Spring Integration セッションファクトリはチャネルごとに個別の物理接続を使用します。Spring Integration 3.0 以降、サーバーへの単一の接続を使用し、その単一の接続で複数の SftpClient インスタンスを作成するように (ブールコンストラクター arg - デフォルト false を使用して) セッションファクトリを構成できます。

この機能を使用する場合は、後で説明するように、操作の完了時に接続が物理的に閉じられないように、セッションファクトリをキャッシュセッションファクトリでラップする必要があります。

キャッシュがリセットされると、最後のチャネルが閉じられたときにのみセッションが切断されます。

新しい操作がセッションを取得したときに接続が切断されると、接続がリフレッシュされます。

あとは、この SFTP セッションファクトリをアダプターに挿入するだけです。

SFTP セッションファクトリに値を提供するより実用的な方法は、Spring のプロパティプレースホルダーサポートを使用することです。

バージョン 6.1.3 以降、DefaultSftpSessionFactory にはカスタム SftpClient をサポートする createSftpClient(…​) が導入されています。カスタム SftpClient で createSftpChannelSubsystem() メソッドをオーバーライドして、たとえば SFTP サブシステムのリクエストと応答用のカスタム RequestHandler を追加する方法については、以下のサンプルを参照してください。

@Override
protected ChannelSubsystem createSftpChannelSubsystem(ClientSession clientSession) {
    ChannelSubsystem sftpChannelSubsystem = super.createSftpChannelSubsystem(clientSession);
    sftpChannelSubsystem.addRequestHandler((channel, request, wantReply, buffer) -> ...);
    return sftpChannelSubsystem;
}

プロパティの構成

次のリストは、DefaultSftpSessionFactory (Javadoc) によって公開されるすべてのプロパティを説明しています。

isSharedSession (コンストラクター引数):: true の場合、リクエストされたすべての SftpSession インスタンスに対して単一の SftpClient が使用されます。デフォルトは false です。

sftpVersionSelector::SFTP プロトコル選択用の SftpVersionSelector インスタンス。デフォルトは SftpVersionSelector.CURRENT です。

host:: 接続先のホストの URL。必須。

hostConfig:: ユーザー / ホスト / ポートオプションの代替としての org.apache.sshd.client.config.hosts.HostConfigEntry インスタンス。プロキシジャンププロパティを使用して構成できます。

port::SFTP 接続が確立されるポート。指定しない場合、この値はデフォルトで 22 になります。指定する場合、このプロパティは正数でなければなりません。

user:: 使用するリモートユーザー。必須。

knownHostsResource:: ホストキーリポジトリに使用される org.springframework.core.io.Resource。リソースのコンテンツは、OpenSSH known_hosts ファイルと同じ形式である必要があり、allowUnknownKeys が false の場合は必須であり、事前に入力する必要があります。

password:: リモートホストに対して認証するためのパスワード。パスワードが指定されていない場合は、privateKey プロパティが必要です。

privateKey:: リモートホストに対する認証に使用される秘密鍵の場所を表す org.springframework.core.io.ResourceprivateKey が提供されていない場合は、password プロパティが必要です。

privateKeyPassphrase:: 秘密鍵のパスワード。userInfo を設定すると、privateKeyPassphrase は許可されません。パスフレーズはそのオブジェクトから取得されます。オプション。

timeout:: timeout プロパティは、デフォルトの接続タイムアウトだけでなく、ソケットタイムアウトパラメーターとしても使用されます。デフォルトは 30 seconds です。0 に設定すると、タイムアウトがないことを意味します。null へ - 無限待機。

allowUnknownKeys:: 不明な (または変更された) キーを持つホストへの接続を許可するには、true に設定します。デフォルトは "false" です。false の場合、事前設定された knownHosts ファイルが必要です。

userInteraction:: 認証中に使用されるカスタム org.apache.sshd.client.auth.keyboard.UserInteraction

バージョン 6.4 以降、DefaultSftpSessionFactory は、内部 SshClient をさらにカスタマイズするための Consumer<SshClient> 構成プロパティを公開します。例: クライアントの NIO ワーカーのデフォルト数とパケットサイズを変更する方法は次のとおりです。

sftpSessionFactory.setSshClientConfigurer((sshClient) -> {
    sshClient.setNioWorkers(27);
    PropertyResolverUtils.updateProperty(sshClient, CoreModuleProperties.MAX_PACKET_SIZE.getName(), 48 * 1024);
});