如何在不使用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>
答案 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>