Создание компонентов Camel из фрагмента XML без Spring - PullRequest
1 голос
/ 06 марта 2019

Как создать экземпляр компонента Camel из фрагмента XML без Spring?

Скажите, у меня есть фрагмент, примерно такой:

<dataFormats>
    <json id="jack" library="Jackson" prettyPrint="true"/>
....
</dataFormats>

, который я хочу проанализировать и вернуть мне в результате

JsonDataFormat jack = new JsonDataFormat(JsonLibrary.Jackson);
jack.setPrettyPrint(true);

или даже тому подобное, от которого я ожидаю, что смогу создать экземпляр Процессора из:

<setHeader headerName="inputRegistryHandler">
   <simple>${header.CamelFileNameOnly}</simple>
</setHeader>

<mvel>request.headers.foo == 'bar'</mvel>

и т.д.

Надеюсь, поддержка XML не будет отменена в Camel 3?

Решение

Следуя совету @Sergei I. ниже, я написал что-то вроде ниже

JAXBContext jc = JAXBContext.newInstance("org.apache.camel.model:org.apache.camel.model.language");
Unmarshaller unmarshal = jc.createUnmarshaller();
ProcessorDefinition pd = (ProcessorDefinition) unmarshal.unmarshal(serviceDefinitionElement);
rc = new DefaultRouteContext(_camelContext);
Processor processor = pd.createProcessor(rc);
_camelContext.addService(processor, true);

Съел элемент DOM, содержащий

<camel:setBody>
    <camel:simple>mike check one two</camel:simple>
</camel:setBody>

как брелок, создающий работоспособный процессор

Возможно, мне понадобится добавить больше java-пакетов, чтобы иметь возможность анализировать больше типов фрагментов Camel XML

Обновление Мне пришлось добавить _camelContext.addService(processor, true); к решению выше. Эта волшебная вещь загружает все компоненты Camel Context в процессор, что дает нам возможность пропустить некоторую конфигурацию. Например, это добавит ObjectMapper к формату данных Джексона без нашего упоминания об этом, и флаг prettyPrint начнет пересекаться:

<camel:unmarshal>
    <camel:jacksonxml unmarshalTypeName="java.util.Map"/>
</camel:unmarshal>
<camel:marshal>
    <camel:json library="Jackson" prettyPrint="true"/>
</camel:marshal>

Ответы [ 2 ]

2 голосов
/ 06 марта 2019

Верблюд использует JAXB для маршалинга и демаршалирования XML. Модели XML определены в пакете org.apache.camel.model. Вы можете попробовать следующее:

JAXBContext jaxbContext = JAXBContext.newInstance(SetHeaderDefinition.class);

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
SetHeaderDefinition setHeaderDefinition = (SetHeaderDefinition) jaxbUnmarshaller.unmarshal(file);
0 голосов
/ 08 марта 2019

Класс CamelContext имеет функцию loadRoutesDefinition, которая позволяет загружать XML-файл.

XML-файл должен иметь такую ​​структуру:

<routes xmlns="http://camel.apache.org/schema/spring">
  <route>
   <from uri.....
  </route>
</routes>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...