Разделите список списков с верблюжьим сплиттером - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть много ArrayList, созданных для хранения коллекций отдельных сущностей, которые можно разделить на их собственные сущности.они добавляются в ArrayList, а затем отправляются на биржу, где я пытаюсь разделить список списков.Кажется, я не могу разделить список списков.

Перепробовал много вариантов Splitter, с жетонами и т. Д.

List<String> serviceRecords = new ArrayList<String>();  //holds an assets collection
List<String> toRecords = new ArrayList<String>();       //holds all asset collections

после сбора предметов, принадлежащих группе, онидобавляется в ArrayList.

serviceRecords.add (sb.toString ());

после добавления всех элементов, список затем добавляется в список.

toRecords.addAll(serviceRecords);

Затем я отправляю список на обмен

exchange.getIn().setBody(toRecords);

Затем маршрут XML, он в беспорядке, пробует разные вещи.ни одна из которых не работает.должен быть хитрость для разделения списка списков.

    <route autoStartup="true" id="core.fleet.asset.splitterRoute">
        <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
        <process id="_process4" ref="assetCollectorProcessor"/>
        <process id="_process5" ref="fleetAssetSplitter"/>
        <split id="FleetSplit">    <!-- strategyRef="tsAggregationStrategy" -->
        <!-- <simple>${body}</simple> -->
        <tokenize token="BLOCKMarker"/>
          <log id="splitBody" message="Split Body: ${body}"/>
          <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMddhhmmss}.csv"/>
          <!-- <process id="getName" ref="fleetAssetFileName"/> -->
          <!-- <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMdd}.csv"/> -->
        </split>
        <!-- <to id="_splitOut" uri="{{fileSplitDestination}}/?fileName=GCMS_asset_${date:now:yyyyMMdd}.csv"/> -->
        <stop/>
    </route>

несколько файлов, сгенерированных из разделения списка списков.

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Я не знаю погоду, чтобы удалить это или оставить для других интересов.
После обнаружения, что я использовал неправильный метод List, List.addAll () вместо List.add (объект) и сделал это исправление,мой плохой, Удивительно, все работает, как ожидалось, теоретические ожидания со всем в своей сфере, это работает.

, так что это довольно просто.вам не нужно делать ничего особенного, чтобы разделить список списков.разделитель будет перебирать список и разбивать отдельные списки.затем вы можете взять эти списки, обработать их и переслать.Глупо думать, что зрелый EIP Camel Splitter ведет себя странно, он делает именно то, что и должно быть.

Это конечный результат.(спасибо Бурки и другим за вашу помощь)

    <route autoStartup="true" id="core.fleet.asset.splitterRoute">
        <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
        <process id="_process4" ref="assetCollectorProcessor"/>
        <process id="_process5" ref="fleetAssetSplitter"/>
        <split id="fs1">
            <simple>${body}</simple>
            <log id="lfs1" message="Original Body: ${body}"/>
            <process id="pfs1" ref="fileSplitter" />
            <to id="seda:fs1" uri="seda:fs1"/>
        </split>
    </route>

Я скрываю имя файла во внутреннем списке списков в позиции -0-, поэтому мы просто извлекаем fileName, устанавливаем CamelFileName, немного массируем данные иотправьте его на биржу.

    log.info("File Splitter :: Start");

    List<String> pl = (List<String>) exchange.getIn().getBody(List.class);
    log.info("File Pay Load: " + pl);

    fName = pl.get(0);  //get file name
    exchange.getIn().setHeader("CamelFileName", fName);
    pl.remove(0);
    log.debug("**** serviceRecords  ****");
    Iterator<String> pitr = pl.iterator(); 
    while ( pitr.hasNext()) {
          log.debug(pitr.next());
      }
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(baos);
    for (String record : pl) {
        out.writeBytes(record + System.lineSeparator());
    }
    out.flush();
    exchange.getIn().setBody(baos.toByteArray());
    out.close();

    log.info("File Splitter :: Finish");
0 голосов
/ 01 февраля 2019

Вы можете использовать JavaBean для реализации вложенной логики Splitter, как вам нравится.

Если стандартный Splitter EIP не может делать то, что вы хотите, вы можете сообщить ему с помощью компонента, как разделить полезную нагрузку вашего сообщения.

Итак, если вы сконфигурировали Splitter для использования вашего пользовательского компонента

from("direct:split")
    .log("Original body: ${body}")
    .split().method(new SplitterBean(), "splitServiceRecords")
    .log("Message part: ${body}")
    .to("mock:end");

И компонент просто соберет все сервисные записи (из вашего примера) в результирующем списке

public List<String> splitServiceRecords(List<List<String>> body) {
    List<String> collectedServiceRecords = new ArrayList<String>();
    // iterate over List containing lists and add each item of
    // the inner list to the Splitter result
    for (List<String> serviceRecords : body) {
        for (String serviceRecord : serviceRecords) {
            collectedServiceRecords.add(serviceRecord);
        }
    }
    return collectedServiceRecords;
}

Список списков станет единым списком со всеми элементами, и каждый элемент станет сообщением, которое в дальнейшем направляется верблюдом.

Log-Output с маршрута выше:

INFO: Original body: [[Foo, Bar, Baz], [Record, item, thing]]
...
INFO: Message part: Foo
INFO: Message part: Bar
INFO: Message part: Baz
INFO: Message part: Record
INFO: Message part: item
INFO: Message part: thing
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...