SFTP en Java: sencillo

Gonzalo Mendoza
2 min readJul 5, 2021
La solución

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

Pruebalo tu mismo

https://github.com/yogonza524/sftp-pool

--

--

Gonzalo Mendoza

Software engineer dedicated to the creation, deployment and continuity of software solutions. With criticality and a broad analytical sense