2011-04-18 18 views
6

He primavera siguiente configuraciónApache Camel ftp consumidor carga los mismos archivos una y otra vez

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://camel.apache.org/schema/spring 
     http://camel.apache.org/schema/spring/camel-spring.xsd"> 

    <bean id="downloadLogger" class="com.thomsonreuters.oa.sdi.camel.DownloadLogger" /> 

    <bean id="fileFilter" class="com.thomsonreuters.oa.sdi.camel.IgnoreReadyFilesFilter" /> 

    <camelContext xmlns="http://camel.apache.org/schema/spring"> 
     <route> 
      <from uri="ftp://url_to_ftp?password=*******&amp;noop=true&amp;stepwise=false&amp;binary=true&amp;consumer.delay=10s&amp;recursive=true&amp;filter=#fileFilter" /> 
      <process ref="downloadLogger" /> 
      <to uri="file:data/outbox" /> 
     </route> 
    </camelContext> 

</beans> 

En el lado ftp tengo 3 carpetas con archivos que quiero descargar. Quiero lograr siguiente escenario:

  1. El FTP es una cantidad fija de archivos (por isntance 5) en el primer consumidor tirón carga datos de estos archivos a la carpeta de destino
  2. En el segundo intento de cargar archivos, ftp estado sigue siendo el mismo (5 archivos) y ftp camello consumidor simplemente no hace nada (excepto cheque para los nuevos archivos)
  3. a FTP llega un nuevo 2 archivos, y en este tirón descarga datos de consumo sólo estas nuevas dos archivos

Por el momento, mis soluciones actuales descarga todos los archivos cada vez que un proceso de carga de datos, cómo puedo administrar información sobre archivos descargados para evitar descargas de duplicados (me refiero a archivos ya copiados de ftp), puedo escribir mi propio filtro que filtrará los archivos ya descargados, pero creo que debería haber una característica incorporada que me dará control de esto (tal vez idempotentRepository, en realidad no estoy seguro) ...

+0

¿Qué versión de camello está usando? ¿Y los 5 archivos están en la misma carpeta o en diferentes subcarpetas? –

+0

La versión Camel es 2.7.0. Hay 1 directorio raíz con 3 subcarpetas, cada subcarpeta puede contener una cantidad diferente de archivos. Para ser más específico, consideremos que una subcarpeta contiene inicialmente 5 archivos y luego a esta carpeta llegan 2 archivos más.Y quiero evitar la descarga de archivos que ya están en la carpeta de destino. – endryha

+0

Hmm noop = true implicaría idempotent también. Pero intento habilitarlo usando idempotent = true en el uri –

Respuesta

12

Debe usar un repositorio idempotente persistente si desea que Camel pueda recordar qué archivos descargó previamente, entre reinicios.

Es necesario configurar esta opción en el punto final ftp: idempotentRepository

Ver más detalles aquí: http://camel.apache.org/file2 . (Nota: El componente FTP hereda las opciones del componente de archivo)

Hay algunos ejemplos en la página wiki sobre cómo usar diferentes tiendas. Y también puedes construir tu tienda personalizada.

+0

Gracias, esto es exactamente lo que quiero lograr. – endryha

4

Por último termino con solución siguiente:

public class SdiRouteBuilder extends RouteBuilder { 
    @Override 
    public void configure() throws Exception { 
     from("ftp://[email protected]_to_ftp/RootFolder?" + 
       "password=******&noop=true&stepwise=false&binary=true&consumer.delay=10s&recursive=true&filter=#fileFilter") 
       .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat"))) 
       .process(new DownloadLogger()) 
       .to("file:data/outbox"); 
    } 
} 
+0

Gracias por esta pista. Parece que no funciona directamente para ftp (establecer propiedades como para el consumidor de archivos). parece que solo funciona si se usa idempotentConsumer en la ruta. – dermoritz

1

Tal @endryha responder trabajo bien en el año 2011, pero no con Camel 2.20.1

En Camello 2.20.1, estos códigos creará dos idempotentRepository

  1. idempotentRepository memoria predeterminada ftp
  2. idempotentConsumer encargo idempotentRepository (archivos basado en º es el caso)

Así que la forma correcta de utilizar idempotentRepository es (I eliminar la mayor parte de parámetros para facilitar la lectura)

"ftp://[email protected]_to_ftp/RootFolder?&idempotent=true&idempotentRepository=#myIdempotentRepo" 

y un Bean

@Bean 
private IdempotentRepository<String> myIdempotentRepo() { 
    return FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat"); 
} 
Cuestiones relacionadas