spring-xd как использовать исходный текст: строка чтения файла одна за другой

У меня есть поток, который просматривает вывод нескольких файлов в каталоге, обрабатывает данные и помещает их в HDFS. Вот моя команда создания потока:

stream create --name fileHdfs --definition "file --dir=/var/log/supervisor/ --pattern=tracker.out-*.log --outputType=text/plain | logHdfsTransformer | hdfs --fsUri=hdfs://192.168.1.115:8020 --directory=/data/log/appsync --fileName=log --partitionPath=path(dateFormat('yyyy/MM/dd'))" --deploy

Проблема в источнике: файловый модуль отправляет все данные, считанные из файла, в модуль обработки журнала вместо одной строки каждый ход, из-за этого строка полезной нагрузки содержит миллионы символов, я не могу ее обработать. Бывший:

--- PAYLOAD LENGTH---- 9511284

Подскажите, пожалуйста, как читать построчно при использовании модуля source:file, спасибо!!!


person Tu Pham    schedule 31.07.2014    source источник


Ответы (4)


В настоящее время он не поддерживается, но было бы легко написать собственный source с помощью Spring Integration inbound-channel-adapter для вызова POJO, который считывает строку за раз.

Пожалуйста, откройте выпуск новой функции JIRA.

Вы также можете сделать это с помощью job вместо stream в XD.

person Gary Russell    schedule 31.07.2014

Я знаю, что это может быть поздно, но для любых гуглеров, которые ищут решение:

Несмотря на то, что нет модуля или опции, которая делает это автоматически, это так же просто, как добавить разделитель, который разделяет входящее сообщение на несколько исходящих сообщений.

Обратите внимание, что вам нужно выбрать между использованием \n и \r\n. Проверьте свои файлы, чтобы увидеть, что они используют.

Пример:

stream create --name filetest --definition "file --outputType=text/plain --dir=/tmp/examplefiles/| splitter --expression=payload.split('\\n') | log" --deploy

Ваше здоровье!

person Joaquin Torre    schedule 03.03.2015

Spring Integration имеет FileSplitter, который разбивает текстовый файл на строки. Вы можете использовать это для создания пользовательского процессорного модуля, назовем его файловым разделением:

  1. Создайте файл file-split.xml со следующим содержимым:

    <?xml version="1.0" encoding="UTF-8"?>
    beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:int="http://www.springframework.org/schema/integration"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/integration 
       http://www.springframework.org/schema/integration/spring-integration.xsd">
    
    <int:splitter input-channel="input" output-channel="output">
            <bean class="org.springframework.integration.file.splitter.FileSplitter">
                    <constructor-arg value="false"/>
            </bean>
    </int:splitter>
    
    <int:channel id="output"/> 
    </beans>
    
  2. Скопируйте файл в ${XD_HOME}/xd/modules/processor/file-split/config/ (при необходимости создайте путь)

  3. Пример использования:

    stream create --name splitFile --definition "file --dir=/data --ref=true | file-split | log" --deploy
    

Вы можете дополнительно настроить модуль, чтобы при необходимости использовать дополнительные параметры.

person Khoa Nguyen    schedule 20.05.2015

вы можете попробовать использовать параметр --mode=lines при развертывании потока. Пожалуйста, проверьте приведенную ниже ссылку на документацию: http://docs.spring.io/spring-xd/docs/current/reference/html/#file

Надеюсь это поможет!

Привет, Пратик

person Pratik    schedule 07.06.2016