2017-10-13 13 views
0

私の春のバッチプロジェクトは、複数のSFTPサーバーからファイルをダウンロードする必要があります。 sftp host/port/filePathは、application.propertiesファイルで設定されています。これらのサーバーとダウンロードファイルを接続するために、バネ統合「sftpアウトバウンドゲートウェイ」を使用することを検討します。しかし、私はどのようにこの種の設定(私はjavaの設定を使用しています)を行い、それを動作させるのか?私はapplication.propertiesファイル内のsftpサーバー情報の設定の数に応じて、複数のセッションファクトリを定義するための何らかの方法が必要だと思います。バネ統合:ソリューション/複数のSFTPサーバーを接続するためのヒント?

プロパティファイル:

sftp.host=host1,host2 
sftp.user=user1,user2 
sftp.pwd=pwd1,pwd2 

Configクラス:

@Bean 
public SessionFactory<ChannelSftp.LsEntry> sftpSessionFactory1() { 

... 
} 

@Bean(name = "myGateway1") 
@ServiceActivator(inputChannel = "sftpChannel1") 
public MessageHandler handler1() { 

... 
} 

@MessagingGateway 
public interface DownloadGateway1 { 
@Gateway(requestChannel = "sftpChannel1") 
    List<File> start(String dir); 
} 

@Bean(name="sftpChannel1") 
public MessageChannel sftpChannel1() { 
    return new DirectChannel(); 
} 

答えて

1

右、サーバはセッションファクトリではなく、ゲートウェイに指定されています。このフレームワークは委任セッションファクトリを提供し、ゲートウェイに送信される各メッセージに対して設定されたファクトリの1つから選択できるようにします。 Delegating Session Factoryを参照してください。

EDIT

はここに例を示します

プロパティを持つ
@SpringBootApplication 
public class So46721822Application { 

    public static void main(String[] args) { 
     SpringApplication.run(So46721822Application.class, args); 
    } 

    @Value("${sftp.name}") 
    private String[] names; 

    @Value("${sftp.host}") 
    private String[] hosts; 

    @Value("${sftp.user}") 
    private String[] users; 

    @Value("${sftp.pwd}") 
    private String[] pwds; 

    @Autowired 
    private DelegatingSessionFactory<?> sessionFactory; 

    @Autowired 
    private SftpGateway gateway; 

    @Bean 
    public ApplicationRunner runner() { 
     return args -> { 
      try { 
       this.sessionFactory.setThreadKey("one"); // use factory "one" 
       this.gateway.send(new File("/tmp/f.txt")); 
      } 
      finally { 
       this.sessionFactory.clearThreadKey(); 
      } 
     }; 
    } 

    @Bean 
    public DelegatingSessionFactory<LsEntry> sessionFactory() { 
     Map<Object, SessionFactory<LsEntry>> factories = new LinkedHashMap<>(); 
     for (int i = 0; i < this.names.length; i++) { 
      DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(); 
      factory.setHost(this.hosts[i]); 
      factory.setUser(this.users[i]); 
      factory.setPassword(this.pwds[i]); 
      factories.put(this.names[i], factory); 
     } 
     // use the first SF as the default 
     return new DelegatingSessionFactory<LsEntry>(factories, factories.values().iterator().next()); 
    } 

    @ServiceActivator(inputChannel = "toSftp") 
    @Bean 
    public SftpMessageHandler handler() { 
     SftpMessageHandler handler = new SftpMessageHandler(sessionFactory()); 
     handler.setRemoteDirectoryExpression(new LiteralExpression("foo")); 
     return handler; 
    } 

    @MessagingGateway(defaultRequestChannel = "toSftp") 
    public interface SftpGateway { 

     void send(File file); 

    } 

} 

...

sftp.name=one,two 
sftp.host=host1,host2 
sftp.user=user1,user2 
sftp.pwd=pwd1,pwd2 
+0

こんにちはゲイリー、私はセットアップで注釈が付け一つのクラスで複数のSFTP接続をしたいと思います@構成。接続情報はプロパティファイルに設定されていますが、私は長い間苦労していますが、実装できません。ありがとう! [この記事も参照してください](https://stackoverflow.com/questions/46802260/how-to-define-multiple-sftp-connections) –

+0

問題が何であるかは不明です。 '@Bean'として複数の接続ファクトリを' @Configuration'に簡単に追加することができます。それぞれには独自のプロパティセットがあります。それはあなたが意味するものではない場合。もっと詳しく説明してください。 –

+0

こんにちはゲイリー、私は複数の@Beanを静的に定義することはできません。接続の量はプロパティファイルによって決まるからです。 BeanはSpringコンテキストに動的に登録する必要があります。 –

関連する問題