2

Spring Integration を利用して、実際に転送することなく、リモートの場所に表示されるファイルに関するメッセージを開始したいと思います。必要なのは、たとえば、ファイルへのパスとファイル名を示すヘッダー値を含むメッセージの生成だけです。

これを達成するための最良の方法は何ですか? FTP インバウンド チャネル アダプターとサービス アクティベーターを組み合わせて、必要なヘッダー値を書き込もうとしましたが、これにより、ファイルがローカルの一時ディレクトリに転送され、サービス アクティベーターがそれを確認するまでに、メッセージは次のようになります。ローカルファイルとリモート パス情報を参照する java.io.Fileがなくなりました。このローカル転送が発生する前にメッセージを変換することは可能ですか?

4

1 に答える 1

2

同様の問題があり、フィルターで解決しました。inbound-channel-adapter では、カスタム フィルターの実装を設定できます。したがって、ポーリングする前にフィルターが呼び出され、ファイルに関するすべての情報が得られます。たとえば、そのファイルをダウンロードするかどうかを決定できます。

<int-sftp:inbound-channel-adapter id="test"
                                  session-factory="sftpSessionFactory"
                                  channel="testChannel"
                                  remote-directory="${sftp.remote.dir}"
                                  local-directory="${sftp.local.dir}"
                                  filter="customFilter"
                                  delete-remote-files="false">
    <int:poller trigger="pollingTrigger" max-messages-per-poll="${sftp.max.msg}"/>
</int-sftp:inbound-channel-adapter>

<beans:bean id="customFilter" class="your.class.location.SftpRemoteFilter"/>

Filter クラスは、FileListFilter インターフェイスの単なる実装です。ここではダミーフィルターの実装です。

public class SftpRemoteFilter implements FileListFilter<LsEntry> {

    private static final Logger log = LoggerFactory.getLogger(SftpRemoteFilter.class);

    @Override
    public final List<LsEntry> filterFiles(LsEntry[] files) {
       log.info("Here is files.");
       //Do something smart
       return Collections.emptyList();
    }
}

しかし、あなたが説明したようにそれをしたい場合は、ペイロードにヘッダーを設定し、そのペイロードを使用しているときに同じヘッダーを使用することでそれを行うことができると思いますが、その場合はMessage<File>サービスアクティベーターメソッドで代わりに File を使用する必要があります.

于 2014-09-15T16:12:19.483 に答える