Camel - настройка заголовков CSV не работает - PullRequest
0 голосов
/ 31 мая 2018

У меня есть файлы CSV без заголовков.Поскольку я использую 'useMaps', я хочу динамически указывать заголовки.Если я устанавливаю заголовки статически, а затем использую в маршруте, он работает нормально, как показано ниже. Подход 1 -

@Component
public class BulkActionRoutes extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        CsvDataFormat csv = new CsvDataFormat(",");
        csv.setUseMaps(true);

        ArrayList<String> list = new ArrayList<String>();
        list.add("DeviceName");
        list.add("Brand");
        list.add("status");
        list.add("type");
        list.add("features_c");
        list.add("battery_c");
        list.add("colors");
        csv.setHeader(list);

        from("direct:bulkImport")
        .convertBodyTo(String.class)
        .unmarshal(csv)
        .split(body()).streaming()
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                GenericObjectModel model = null;
                HashMap<String, String> csvRecord = (HashMap<String, String>)exchange.getIn().getBody();
            }
        });
    }
}

Однако, если список передается через заголовки Camel, как показано ниже, он не работает Подход 2 -

@Component
public class BulkActionRoutes extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        CsvDataFormat csv = new CsvDataFormat(",");
        csv.setUseMaps(true);

        from("direct:bulkImport")
        .convertBodyTo(String.class)
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                ArrayList<String> fileHeaders = (ArrayList<String>)headers.get(Constants.FILE_HEADER_LIST);
                if (fileHeaders != null && fileHeaders.size() > 0) {
                    csv.setHeader(fileHeaders);
                }
            }
        })
        .unmarshal(csv)
        .split(body()).streaming()
        .process(new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                GenericObjectModel model = null;
                HashMap<String, String> csvRecord = (HashMap<String, String>)exchange.getIn().getBody();
            }
        });
    }
}

Что может отсутствовать в подходе 2?

1 Ответ

0 голосов
/ 31 мая 2018

Большая разница между подходом 1 и 2 заключается в объеме.

В подходе 1 вы полностью настраиваете формат данных CSV.Все это выполняется при создании контекста верблюда , поскольку формат данных используется совместно с контекстом верблюда.Когда сообщения обрабатываются, это одинаковая конфигурация для всех сообщений .

В подходе 2 вы просто настраиваете основы глобально.Конфигурация заголовка находится в пределах маршрута и, следовательно, может изменяться для каждого отдельного сообщения .Каждое сообщение будет перезаписывать конфигурацию заголовка экземпляра формата глобальных контекстных данных.

Не будучи уверенным в этом, я предполагаю, что невозможно изменить глобальный контекстный DataFormat внутри маршрутов .

Что бы вы ожидали (только для примера), когда сообщения обрабатываются параллельно?Они будут перезаписывать конфигурацию заголовка друг против друга.

В качестве альтернативы вы можете использовать POJO, где вы можете выполнить динамический маршал / демаршал из кода Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...