2017-10-13 13 views
0

Mon projet de lot de printemps doit télécharger des fichiers à partir de plusieurs serveurs sftp. L'hôte sftp/port/filePath est configuré dans le fichier application.properties. J'envisage d'utiliser la passerelle 'outft-bound gateway' de l'intégration de printemps pour connecter ces serveurs et télécharger des fichiers. mais je ne sais pas comment faire ce genre de configuration (j'utilise java config) et le faire fonctionner? Je suppose que j'ai besoin d'un moyen de définir plusieurs usine de session en fonction du nombre de config info de serveur sftp dans le fichier application.properties.intégration de printemps: solutions/conseils sur connecter plusieurs serveur sftp?

fichier de propriétés:

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

classe 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(); 
} 

Répondre

1

droite, le serveur est spécifié dans l'usine de session, pas la passerelle. La structure fournit une fabrique de sessions délégante, ce qui permet de la sélectionner dans l'une des usines configurées pour chaque message envoyé à la passerelle. Voir Delegating Session Factory.

EDIT

Voici un exemple:

@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); 

    } 

} 

propriétés ...

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

Salut Gary, je voudrais installer plusieurs connexions SFTP avec une classe annotée avec @ Configuration. l'information de connexion est config dans le fichier de propriétés, j'ai lutté pendant longtemps mais je ne peux pas l'implémenter, pouvez-vous donner quelques conseils? Merci! [voir aussi ce post] (https://stackoverflow.com/questions/46802260/how-to-define-multiple-sftp-connections) –

+0

Il n'est pas clair quel est le problème; vous pouvez facilement ajouter plusieurs fabriques de connexions en tant que '@ Bean's dans votre @ Configuration, chacune avec son propre ensemble de propriétés. Si ce n'est pas ce que tu veux dire; s'il vous plaît expliquer dans beaucoup plus de détails. –

+0

Bonjour Gary, Je ne peux pas définir plusieurs @Bean statiquement car la quantité de connexion dépend du fichier de propriétés. les haricots doivent être enregistrés dans le contexte du printemps dynamiquement. –