#csv #apache-camel
#csv #apache-camel
Вопрос:
Мне нужно создать csv-файл на основе входящих сообщений. Я делаю это, добавляя к файлу с:
.toD("file://" OUTPUT_PATH "?FileName=${exchangeProperty.OUTPUT_FILENAME}" "amp;FileExist=Append")
Хотя это работает нормально, я столкнулся с одной проблемой. Мне также нужно включить строку заголовка в файл CSV. Прямо сейчас я выполняю маршалинг в формате CSV с помощью .mashall().csv(), но при этом заголовок опускается.
Хотя я могу создать формат CSV с заголовком с:
CsvDataFormat csvFormatWithHeader = new CsvDataFormat();
csvFormatWithHeader.setHeader(Arrays.asList(new String[] { "A", "B", "C", "D" }.clone()));
.marshall(csvFormatWithHeader)
Это добавит строку заголовка для каждой добавляемой мной строки.
Итак, чего я хочу добиться, так это добавлять заголовок только при создании нового файла.
Я пробовал два подхода, но ни один из них не сработал:
- Проверьте, существует ли файл в маршруте, и соответствующим образом примените формат csv
- Установите формат данных marshall с помощью компонента или метода
В качестве последнего варианта я мог бы добавить заголовок, когда файл закрыт, но это кажется неэффективным, поскольку я не знаю, насколько большим может стать этот файл.
Как я могу достичь любого из этих подходов с помощью Apache Camel 2.23.2.
Ответ №1:
Хорошо, в конечном итоге, используя заголовок, я смог заставить вариант 1 работать. Вот как выглядит мой маршрут сейчас:
.setProperty("OUTPUT_FILENAME",method(this, "determineOutputFilename()"))
.setHeader("fileExists", method(this, "outputFileExists"))
.choice()
.when(header("fileExists"))
.marshal().csv()
.endChoice()
.otherwise()
.marshal(csvFormatWithHeader)
.endChoice()
.end()
Логика проверки файла (реализована в классе route):
public boolean outputFileExists(@ExchangeProperty("OUTPUT_FILENAME") String fileName){
boolean fileExists = new File(PROCESSING_PATH "/" fileName).exists();
return fileExists;
}