SFTP en Java: sencillo
En la actualidad, gran cantidad de empresas comparte informes de todo tipo (financieros, reportes de uso, diagnostico, etc) a otras empresas, con las cuales cumplen contrato, mediante SFTP (Secure File Transfer Protocol)
¿Cómo me conecto a un SFTP?
Esta pregunta tiene varias formas de responderse, entre las mas conocidas/utilizadas se encuentra el mecanismo que provee Spring Integration.
En este caso, solo me tomaré el tiempo de responder esta pregunta sin hacer uso de Frameworks robustos.
Para tal fin utilizaremos solamente 2 librerias
jsch-extension
commons-pool2 (Apache Commons)
Con estas librerias a la mano podemos primero conectarnos al SFTP y con Apache Commons Pool2 podremos gestionar las conexiones de manera transparente mediante sesiones
¿Donde esta el SFTP?
Para conectarnos a un SFTP siempre vamos a requerir los siguientes datos:
- Host
- Usuario
- Contraseña
El puerto de conexión por lo general es el puerto 22
Un SFTP en Docker
A modo de ejemplo y a fines de testear la solucion vamos a ejecutar un servidor SFTP de manera local. Para ello solo requerimos ejecutar el siguiente comando en la consola
docker run -p 22:22 emberstack/sftp --name sftp
Las credenciales son usuario “demo” y password “demo”
Creando una fabrica de sesiones
DefaultSessionFactory sessionFactory = new DefaultSessionFactory();
sessionFactory.setHostname("127.0.0.1");
sessionFactory.setUsername("demo");
sessionFactory.setPassword("demo");
sessionFactory.setConfig("StrictHostKeyChecking", "no");
SessionManager sm = new SessionManager(sessionFactory);
Es importante colocar las configuraciones necesarias para la sesión, las credenciales son obligatorias pero se pueden agregar otras
Pool de sesiones (Apache Commons)
ObjectPool<ChannelSftp> pool =
ChannelSftpConnectionsFactory.createPool(sm, new GenericObjectPoolConfig<>());
El objeto pool nos servirá para utilizar la gestion de sesiones de manera transparente
Ejecutemos peticiones al SFTP
ChannelSftpConnectionsFactory.execute(
pool,
sftp -> { // Your code using sftp object here },
e -> { // Handle exception if something wrong happened }
);
Utilizando esta llamada estática y dos consumers podemos establecer un contexto de ejecución de peticiones al SFTP y en caso de error manejarlo en el segundo consumer (e)
Beneficios
- Simple, rapido de implementar
- Flexible, provee la posibilidad de manipular distintos escenarios
- Agnostico, no requiere grandes frameworks