在没有Spring的情况下从XML代码段实例化Camel组件

时间:2019-03-06 16:50:45

标签: java apache-camel

如何在不使用Spring的情况下从XML代码段实例化Camel组件?

说,我有一个片段,像这样:

<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>

希望Camel 3中不会放弃XML支持吗?

解决方案

按照下面的@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 Bean加载到处理器中,这使我们能够省略某些配置。例如,这会将ObjectMapper添加到Jackson数据格式,而无需我们特别提及,prettyPrint标志开始被复制:

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

2 个答案:

答案 0 :(得分:2)

Camel使用JAXB封送和取消封送XML。 XML模型在org.apache.camel.model包中定义。您可以尝试以下操作:

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

Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
SetHeaderDefinition setHeaderDefinition = (SetHeaderDefinition) jaxbUnmarshaller.unmarshal(file);

答案 1 :(得分:0)

CamelContext类具有允许加载xml文件的功能loadRoutesDefinition。

Xml文件应具有以下结构:

<routes xmlns="http://camel.apache.org/schema/spring">
  <route>
   <from uri.....
  </route>
</routes>