¿Por qué mi conector Alpakka SFTP nunca se conecta?

Soy nuevo en Alpakka/Akka Streams y estoy tratando de configurar un flujo donde transmito datos entre dos servidores SFTP con mi sistema en el centro, aquí está el código.

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.alpakka.ftp.scaladsl.Sftp
import akka.stream.alpakka.ftp.{FtpCredentials, SftpSettings}
import akka.stream.scaladsl.Keep
import net.schmizz.sshj.{DefaultConfig, SSHClient}

import java.net.InetAddress

class StreamingSftpTransport {
  implicit val system: ActorSystem = ActorSystem("dr-service")
  implicit val materializer: ActorMaterializer = ActorMaterializer()

  private val PORT = 22
  private val USER = "testsftp"
  private val CREDENTIALS = FtpCredentials.create(USER, "t3st123")
  private val BASEPATH = s"/home/$USER"
  private val FILE_NAME = "testfile"

  // Set up the source system connection
  private val SOURCE_HOSTNAME = "host1"

  private val sourceSettings = SftpSettings.apply(host = InetAddress.getByName(SOURCE_HOSTNAME))
    .withCredentials(CREDENTIALS)
    .withPort(22)

  private val sourceClient = new SSHClient(new DefaultConfig)
  private val configuredSourceClient = Sftp(sourceClient)


  // Set up the destination system connection

  private val DEST_HOSTNAME = "host2"
  private val destSettings = SftpSettings.apply(host = InetAddress.getByName(DEST_HOSTNAME))
    .withCredentials(CREDENTIALS)
    .withPort(22)

  private val destClient = new SSHClient(new DefaultConfig)
  private val configuredDestClient = Sftp(destClient)

  /**
   * Execute the stream from host1 to host2
   */
  def doTransfer(): Unit = {
    val source = configuredSourceClient.fromPath(s"$BASEPATH/$FILE_NAME", sourceSettings)
    val sink = configuredDestClient.toPath(s"$BASEPATH/$FILE_NAME", destSettings)
    val runnable = source.toMat(sink)(Keep.right).run()
  }
}

He llamado esto de una prueba de unidad con new StreamingSftpTransport.doTransfer() pero nunca intenta conectarse. ¿Qué estoy haciendo mal?

Pregunta hecha hace 3 años, 4 meses, 28 días - Por coderconqueror


3 Respuestas:

  • Como sugirió Artur en el comentario sobre mi pregunta, no estaba bloqueando el futuro para que el JVM estuviera saliendo antes de que se pudiera establecer la conexión.

    Añadiendo la siguiente línea permitieron establecer las conexiones

    Await.result(runnable, 180 seconds)
    

    PS: No hagas esto en producción :)

    Respondida el Dec 17, 2020 a las 14:52 - por codecraftsman

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando puede deberse a que no estás estableciendo una conexión explícita con los servidores SFTP al configurar los clientes SFTP con el objeto Sftp.

    En el código proporcionado, estás creando instancias de SSHClient, pero no estás inicializando ni conectando explícitamente esos clientes SFTP con los servidores SFTP. Por lo tanto, cuando se ejecuta el flujo, los clientes SFTP no están conectados a los servidores SFTP, lo que impide que se realice la transferencia de archivos.

    Para solucionar este problema, debes establecer la conexión explícitamente después de configurar los clientes SFTP. Aquí hay un ejemplo de cómo podrías hacerlo en tu código:

    scala
    // Conectar cliente SFTP de origen
    sourceClient.connect(SOURCE_HOSTNAME, PORT)
    configuredSourceClient
    
    // Conectar cliente SFTP de destino
    destClient.connect(DEST_HOSTNAME, PORT)
    configuredDestClient
    

    Al llamar a connect en los clientes SFTP después de configurarlos, estarás estableciendo la conexión con los servidores SFTP. Esto permitirá que el flujo de datos funcione correctamente y se realice la transferencia de archivos entre los servidores SFTP.

    Es importante recordar también cerrar adecuadamente las conexiones después de finalizar la transferencia de archivos para liberar recursos. Puedes hacerlo llamando al método disconnect en los clientes SFTP cuando no los necesites más.

    Espero que esta información te sea útil y que te ayude a resolver el problema con tu conector Alpakka SFTP. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 14:52 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Hay algunos problemas potenciales con el código proporcionado:

    • Creación de clientes SSH: En lugar de crear instancias de `SSHClient` manualmente, puedes utilizar los métodos `newSSHClient` y `newSftpClient` proporcionados por `Alpakka SFTP`. Esto asegurará que los clientes se configuren correctamente con las opciones de conexión especificadas.
    • Configuración de la conexión SFTP: El código utiliza `SftpSettings` para configurar las conexiones SFTP, pero no establece explícitamente el número de puerto para las conexiones de destino. Agrega la siguiente línea para configurar el puerto de destino:

    scala
       private val destSettings = SftpSettings.apply(host = InetAddress.getByName(DEST_HOSTNAME))
         .withCredentials(CREDENTIALS)
         .withPort(PORT) // Establece explícitamente el número de puerto para la conexión de destino
       

    • Cierre de clientes SSH: Después de utilizar los clientes SSH, es importante cerrarlos correctamente para liberar los recursos. Agrega los siguientes bloques `finally` para cerrar los clientes:

    scala
       private val sourceClient = Sftp(newSSHClient(sourceSettings))
       try {
         // Código de transferencia
       } finally {
         sourceClient.close()
       }

    private val destClient = Sftp(newSSHClient(destSettings)) try { // Código de transferencia } finally { destClient.close() }

    • Llamada a `run`: El método `run` es asincrónico y devuelve un objeto `Future`. Para esperar a que se complete la transferencia, debes llamar al método `onComplete` en el futuro devuelto por `run`.

    scala
       val runnable = source.toMat(sink)(Keep.right).run()
       runnable.onComplete {
         case Success(_) => println("Transferencia completada")
         case Failure(exception) => println(s"Error en la transferencia: $exception")
       }
       

    Prueba estos cambios y verifica si tu conector Alpakka SFTP se conecta y transfiere archivos correctamente.

    Respondida el Dec 18, 2020 a las 14:56 - por Gemini

    Votos positivos: 0 | Votos negativos: 0