Агрегатор Apache Camel для объединения XML-документов в один огромный документ - PullRequest
1 голос
/ 28 апреля 2011

Возможно ли объединить несколько небольших XML-документов:

<doc><field name="XXX">fieldValue</field><doc>

с использованием aggregator2 (верблюд 2.7.0) в один большой документ

<result><doc>...</doc><doc>...</doc><doc>...</doc>...<doc>...</doc></result>

без использования какого-либо специального процессора-агрегатора?Мне удалось завершить создание собственного агрегатора, но теперь я упрощаю свой код, поэтому хотел бы избавиться от него, если верблюд поддерживает это из коробки.

Мой настраиваемый агрегатор выглядит следующим образом:

class DocsAggregator implements Processor {
  void process(Exchange exchange) {

    def builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
    def Document parentDoc = builder.parse(new ByteArrayInputStream("<?xml version='1.0'?><add></add>".toString().bytes));
    def groupedExchanges = exchange.properties.find {it.key == 'CamelGroupedExchange'}

    groupedExchanges.value.each { Exchange x ->
    def Document document = x.'in'.body

    def bos = new ByteArrayOutputStream()
    TransformerFactory.newInstance().newTransformer().transform(new DOMSource(document), new StreamResult(bos))
    def node = document.documentElement.childNodes.find { Node it -> it.nodeType == Node.ELEMENT_NODE}
    def cloned = parentDoc.adoptNode(node)
    parentDoc.documentElement.appendChild(cloned)
   }
   exchange.in.body = parentDoc
  }
}

Ответы [ 2 ]

4 голосов
/ 29 апреля 2011

Хорошо, так что вы используете групповую опцию обмена.Тогда это немного по-другому.Данные хранятся в виде свойства на бирже в виде списка.

Вместо процессора вы можете использовать POJO и привязать параметр к свойству.Но список по-прежнему содержит объекты Exchange, поэтому вам нужно вызвать для него методы getIn (). GetBody ().Но если вы делаете это так, вам не нужно импортировать API-интерфейс Camel в POJO.

public Document mergeMyStuff(@Property("CamelGroupedExchange") List grouped) {

    Document parent = ...
    for (int i = 0; i < grouped.size; i++) {
        Document doc = list.get(i).getIn().getBody(Documemt.class);
        .. add to parent doc
    }

    return parent;
}
1 голос
/ 28 апреля 2011

Под пользовательским процессором-агрегатором вы имеете в виду пользовательскую AggregationStrategy? Если это так, то нет. В настоящее время это требуется.

Мы планируем предложить модель pojo для агрегирования, поэтому вам не нужно использовать этот Camel API. Поэтому ожидайте, что это будет проще в будущем.

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