Apache Camel Message Exchange - можете ли вы перебрать обмен для создания нескольких выходных файлов из одного сообщения в обмен - PullRequest
0 голосов
/ 29 января 2019

У меня есть одно входящее сообщение на бирже.Это сообщение разделено на несколько исходящих файлов.Проблема, которую я вижу, состоит в том, что только файл LAST произведен.Журналы показывают, что мы успешно создали все различные файлы, однако, можно записать только один файл в обмен, обработанный LAST файл?пожалуйста, скажите мне, что я делаю не так, Камелерс.заранее спасибо!

установка CamelFileName или Exchange.FILLE_NAME

Логика, которая разбивает один файл на несколько файлов, помещая содержимое определенного файла в ArrayList....

    log.info("Create output file for current asset: " + asset + " with fileName: " + fileName);
    StringBuilder ofsb = new StringBuilder();
    ofsb.append(outFolder).append("_").append(fileName).append("_").append(TimeStamp()).append(".csv");

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(baos);
    for (String row : serviceRecords) {
        out.writeBytes(row + System.lineSeparator());
    }
    out.flush();

      log.info("**** serviceRecords  " + " file name: " + fileName + "****");
      Iterator<String> pitr = serviceRecords.iterator(); //get the existing service records in array list
      while ( pitr.hasNext()) {
          String sRecord = pitr.next(); 
          log.info(pitr.next());
      }
    exchange.getOut().setHeader("CamelFileName", ofsb.toString());  //CamelFileName Exchange.FILE_NAME
    log.info("Asset File Name: " + exchange.getOut().getHeader("CamelFileName"));
    exchange.getOut().setBody(baos.toByteArray());
    baos.close();
    out.close();
    serviceRecords = new ArrayList<String>();
    sb = new StringBuilder();   
    ofsb = new StringBuilder(); 
    } 

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

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

1548278588, G1.A_96BD1,1027.8129883, Float, GOOD 1548278590, G1.A_96BD1,1046.7722168, Float, GOOD1548278591, G1.A_96BD1,1037.0013428, поплавок, ХОРОШО 1548278596, G1.A_96BD1,1046.5593262, поплавок, ХОРОШО 1548278598, G1.A_96BD1,1034.9998779, поплавок, ХОРОШО

В ТЕЧЕНИЕ ВАСЕДИНСТВЕННЫЙ ОБМЕН ???

Я знаю, что-то подобное работает, но это не соответствует верблюжьей инфраструктуре.
ofsb.append (outFolder) .append (""). Append (fileName). .append ( "") добавить (TimeStamp ()) добавить ( "CSV.").Файл файл = новый файл (dir, ofsb.toString ());FileWriter fileWriter = новый FileWriter (файл);CRLFPrintWriter out = новый CRLFPrintWriter (fileWriter);for (String outputLine: serviceRecords) {// otemp, oServiceRecords, seviceRecords, osRecords out.println (outputLine);}

    out.flush();
    out.close();
    fileWriter.close();

    serviceRecords = new ArrayList<String>(); //reset serviceRecords record list of output records
    sb = new StringBuilder(); //reset record builder    
    ofsb = new StringBuilder(); //reset file name
    } 

---- СНИПИТ Camel XML

<route autoStartup="true" id="core.fleet.asset.splitterRoute">
    <from id="_from4" uri="{{fileEnrichmentEndpoint}}"/>
    <process id="_process4" ref="assetCollectorProcessor"/>
    <process id="_process5" ref="fleetAssetSplitter"/>
    <to id="_splitOut" uri="{{fileSplitDestination}}"/>
</route>

1 Ответ

0 голосов
/ 30 января 2019

Что касается того, что вы спрашиваете (разбить сообщение и записывать части в файлы), в этом вопросе слишком много Java-кода.

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

<route id="split">
    <from uri="[endpoint where full message arrives]"/>
    ...
    <split ...>
        ...
    </split>
    <to uri="direct:writeFiles"/>
</route>

<route id="writeFiles">
    <from uri="direct:writeFiles"/>
    <setHeader headerName="CamelFileName">
        <simple>...</simple>
    </setHeader>
    <to uri="file:directory?option=value"/>
</route>

Маршрут "split" получает сообщение для разделения.Вы можете делать все, что вам нужно (например, ваше обогащение).В определенный момент вы используете Splitter до , чтобы разбить сообщение на части .

После разделения вы отправляете отдельные части сообщения (результат работы разделителя) на другой маршрут.В моем примере это прямой маршрут, но вы также можете использовать очередь сообщений ( ActiveMQ ) или очередь в памяти ( Seda ).

Второйroute ("writeFiles") просто получает части сообщения и сохраняет их в файлы .Файловый компонент Camel просто записывает тело сообщения в файл.

...