2016-11-29 7 views
1

私はSpringインテグレーションを使用してFTPを介してリモートディレクトリにファイルをアップロードするWebプロジェクトを行っています。ただし、FTPプロパティはデータベースから動的にロードされ、要求ごとに異なる場合があります。単純なアプローチ:ダイナミックFTPプロパティを使用したSpringインテグレーションのアップロード

最初DefaultFtpSessionFactory豆作成:

@Bean 
public DefaultFtpSessionFactory defaultFtpSessionFactory() { 
    return new DefaultFtpSessionFactory(); 
} 

IntegrationFlowがBean:

@Bean 
public IntegrationFlow integrationFlow(DefaultFtpSessionFactory defaultFtpSessionFactory) { 
    // Flow config 
} 

がコントローラにこのBeanを注入してプロパティ設定:もちろん

@Autowired 
private DefaultFtpSessionFactory defaultFtpSessionFactory; 

@Autowired 
private FtpConfigService ftpConfigService; 

@RequestMapping(value = "upload", method = RequestMethod.GET) 
public RequestEntity<String> upload() { 
    defaultFtpSessionFactory.setHost(ftpConfigService.getHost()); 
    // Set other properties 
    // ... and upload file 

    return new RequestEntity<>(HttpStatus.OK); 
} 

を、この競争状態があるので、悪い考えです(2つのreque同じ時間にシングルトンDefaultFtpSessionFactoryにアクセスできます)。だから、私はこれをどのようにして安全に達成することができますか?

+0

あなたができることは、あなたのftpペイロードと、フロー内のsessionFactoryを更新するために使用できるセッションプロパティを含むMessageを作成することです。 – JEY

答えて

1

フローの最終部分を動的に登録します。the blog introducing the featureを参照してください。キャッシュ内にこれらのフローを保持することがあります。

複数のtcpクライアントアダプタを動的に作成して入力チャネルをキャッシュする例については、dynamic-tcp-clientを参照してください。 ftpにも同様のテクニックを使用してください。これには、DSLとダイナミックフロー登録より先行する古いサンプルがあります(dynamic-ftp)。

+0

私はSpring 4を使っているので、あなたの動的FTPの例を見ました。私が見ている限り、新しい 'MessageChannel'ごとに新しい' ApplicationContext'を作成してキャッシュしています。文脈の作成を避けることは可能ですか?さらに、すべての機能を有効にするために、アプリケーションの起動時に自動的にBeanを起動する必要はありません。構成クラス/ XMLは '@ ComponentScan'スコープの外に留まらなければならないので、非常に不便です。 –

+0

ダイナミックフローメソッド(引用したtcpサンプルで使用されています)は子コンテキストを作成しません。 [Delegating Session Factory](http://docs.spring.io/spring-integration/reference/html/ftp.html#ftp-dsf)を使うこともできます。実際の接続/セションは 'ThreadLocal'から決定されます。 。 –

関連する問題