2014-11-06 6 views
1

У меня есть требование, когда я хочу использовать ftp и помещать файл в динамический локальный каталог. Я также хочу добавить фильтр возраста. Это не позволяет пропустить старые файлы. Это работает с файлом должным образом. Я добавил специальный фильтр и проверил дату создания объектов File с помощью этого кода:Объединение каналов удаляет заголовок file_originalFile

int ageLimit = Integer.parseInt(props.getProperty("file.age")); 
     BasicFileAttributes view = null; 
     try 
     { 
      view = Files.getFileAttributeView(
        Paths.get(f.getAbsolutePath()), 
        BasicFileAttributeView.class).readAttributes(); 
     } catch (IOException e1) 
     { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     FileTime ft = view.creationTime(); 
     if (((new Date()).getTime() - (((ft.to(TimeUnit.MILLISECONDS))/*/10000L) - 11644473600000L*/))) > ageLimit 
       * (24 * 60 * 60 * 1000))// file creation 
             // date(converted 
             // to 
             // java.util.date) 
             // - current 
             // date > 
             // oldness in ms 
     { 
      logger.info("File is old:" + (f.getName())); 
      return false; 
     } 

Это прекрасно работает для адаптера для файлов. Но когда я добавил поддержку ftp, объект, который я получил в полезной нагрузке, был объектом FTPFile. Это не дает createdate, но дает последнюю измененную дату. Последняя измененная дата не подходит для меня. Поэтому мне пришлось настроить ftp, а затем связать файловый адаптер с каталогом.

  1. прерывание INT-FTP: въездной-канальный-адаптер подхватывает файл с сайта FTP и помещает его в локальном каталоге.

  2. Этот файл подбирается по инет-файлу: входящему каналу-адаптеру и помещается в конечный пункт назначения.

Это двухэтапный процесс для загрузки файла, помещенного в местоположение ftp.

Класс фильтра работает с внутренним файлом: входящим каналом-адаптером. Эта цепочка работает.

Проблема заключается в удалении исходных файлов. Файл ftp-сайта (удаленный каталог) автоматически удаляется. Файл локального каталога, который подбирается в файле int-file: inbound-channel-adapter, не удаляется.

Это моя конфигурация.

 <int:channel id="ftpChannel"/> 
<int-ftp:outbound-channel-adapter id="ftpOutbound" 
    channel="ftpChannel" 
    session-factory="ftpClientFactory" 
    charset="UTF-8" 
    remote-file-separator="/" 
    auto-create-directory="true" 
    remote-directory="." 
    use-temporary-file-name="true" 
    /> 
<int-ftp:inbound-channel-adapter id="ftpInbound" 
    channel="ftpChannel" 
    session-factory="ftpClientFactory" 
    charset="UTF-8" 

    local-directory="file:${paths.root}" 
    delete-remote-files="true" 
    temporary-file-suffix=".writing" 
    remote-directory="." 
    filename-pattern="*${file.char}*${file.char}*${file.char}*${file.char}*${file.char}*" 

    preserve-timestamp="true" 
    auto-startup="true"> 
    <int:poller fixed-rate="1000"/> 
    </int-ftp:inbound-channel-adapter> 
     <bean id="ftpClientFactory" 
    class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory"> 
    <property name="host" value="${ftp.ip}"/> 
    <property name="port" value="${ftp.port}"/> 
    <property name="username" value="${ftp.username}"/> 
    <property name="password" value="${ftp.password}"/> 
    <property name="clientMode" value="0"/> 
    <property name="fileType" value="2"/> 
    <property name="bufferSize" value="100000"/> 
</bean> 

     <int-file:outbound-channel-adapter channel="abc" id="filesOut" 
     directory-expression="@outPathBean.getPath()" 
     delete-source-files="true" filename-generator="fileNameGenerator" /> 

<int:header-enricher input-channel="ftpChannel" output-channel="ftpChannel"> 
    <int:header name="file_originalFile" ref="getPath" method="getCurrentPath" /> 
</int:header-enricher> 

     <int-file:inbound-channel-adapter id="filesIn" directory="file:${paths.root}" channel="abc" filter="compositeFilter" > 
     <int:poller id="poller" fixed-delay="5000" /> 

    </int-file:inbound-channel-adapter> 
    <int:channel id="abc"/> 

Также определены фасоль настраиваемого фильтра и фанера -генератора.

Я добавил заголовок-обогатитель, чтобы добавить заголовок file_originalFile, когда я где-то читал, что этот заголовок опущен, если файл используется дважды/цепочка, как в моей ситуации. Хотя метод beans вызывается, и я написал в нем следующий код, файл не удаляется из исходной директории файловых адаптеров.

public String getCurrentPath(Message<File> payload) 
{ 


    File f = payload.getPayload(); 
    if (payload.getHeaders().get(FileHeaders.ORIGINAL_FILE)== null) 
    { 
     return f.getAbsolutePath(); 
    } 
    else 
    { 
     payload.getHeaders().get(FileHeaders.ORIGINAL_FILE).toString(); 
    } 
    return null; 
} 

Что я делаю неправильно? Я пробовал использовать header-enricher для канала abc, а также не повезло!

Надежда проблема теперь ясно .. Спасибо за вашу помощь

+0

Извините, но это еще не все, что происходит. Объясните, пожалуйста, ваше требование и какая у вас проблема. –

ответ

0

Касательно:

Невозможно преобразовать значение типа [org.springframework.integration.endpoint.EventDrivenConsumer] для требуемого типа [орг .springframework.messaging.MessageChannel] для свойства «outputChannel»: нет соответствия редакторов или преобразования стратегии найдены

Поскольку у вас есть <int-ftp:outbound-channel-adapter id="ftpOutbound" channel="ftpChannel"

Вы вы должны использовать канала имени боб для <int:transformer id="testTransformer" input-channel="ftpInbound", скорее id этого адаптера <int:transformerd="testTransformer" input-channel="ftpChannel"

+0

, а не если ??? означает? Имя канала канала - ftpChannel? – kavita

+0

Извините, замечены ошибки в моем ответе. Да, вы должны использовать 'ftpChannel' от' ' –

+0

сделали это. Могу ли я определить исходный каталог из полезной нагрузки? Если это так, я могу использовать общий трансформатор для обоих путей – kavita

0

Не совсем ясно, в чем ваш вопрос.

Это означает, что интеграция с весной 3.0 introduced the local-filter on the (s)ftp adapters, которая должна позволить вам использовать свой собственный фильтр.

Чтобы удалить локальный файл с помощью заголовка, вы можете использовать совет обработчика запроса, см. Образец retry-and-more для получения дополнительной информации.

Исключением является то, что вы вводите исходящий адаптер в качестве output-channel трансформатора; вам следует ввести ftpChannel.

+0

Теперь я отправляю канал, и он не дает никаких исключений. Редактирует мой q для ясности – kavita

+0

Почему вы добавляете заголовок? Он не используется в этом контексте. Использование «ftpChannel» в качестве входного и выходного канала на обогатителе не является хорошей практикой. Он будет работать в этом случае, но я бы не рекомендовал его; использовать дискретные каналы. Назначение адресата на том же диске? Если это так, адаптер просто переименовывает входной файл; если нет, он будет копировать и удалять (и записывать журнал INFO). Я предлагаю вам включить ведение журнала DEBUG, чтобы выяснить, какова ваша проблема. –

+0

Я где-то читал, что заголовок, если нет, приведет к тому, что исходный файл не будет удален. Вот почему я попытался использовать обогатителя. Да, пункт назначения находится на том же диске, что и локальный каталог. Это может быть неправильный сетевой путь? Так в чем причина, почему мой файл не будет удален из локального каталога? Любые входы? – kavita

Смежные вопросы