这看起来很简单,但我似乎无法在Camel文档中找到它。
与我的上一个问题相关,即Get BeanCreationException when try to add Jackson Library我现在有了我的代码,将JMS日志响应消息放入JSON格式。
以下是我在运行代码时获得的内容:
23118 [hello.world.request.timer] INFO hello.world.request - Exchange[Id:e93861e4- a5be-4d63-b658-5939f414e595, ExchangePattern:InOnly, Properties: {CamelToEndpoint=log://hello.world.request?showAll=true, CamelTimerFiredTime=Fri Oct 11 12:03:20 EDT 2013, CamelTimerPeriod=10000, CamelTimerName=hello.world.request.timer}, Headers:{firedTime=Fri Oct 11 12:03:20 EDT 2013}, BodyType:null, Body:null, Out: null]
Returning Map
key= fruit1DataType, value= String
key= fruit1, value= apple
key= fruit1Calories, value= 95
key= fruit1ColorDataType, value= String
key= fruit1CaloriesDataType, value= int
key= fruit1Color, value= red
23122 [hello.world.request.timer] INFO hello.world.response - Exchange[Id:e93861e4- a5be-4d63-b658-5939f414e595, ExchangePattern:InOnly, Properties: {CamelToEndpoint=log://hello.world.response?showAll=true, CamelTimerFiredTime=Fri Oct 11 12:03:20 EDT 2013, CamelTimerPeriod=10000, CamelTimerName=hello.world.request.timer}, Headers:{firedTime=Fri Oct 11 12:03:20 EDT 2013}, BodyType:byte[], Body: {"fruit1DataType":"String","fruit1":"apple","fruit1Calories":"95","fruit1ColorDataType":"St ring","fruit1CaloriesDataType":"int","fruit1Color":"red"}, Out: null]
理想情况下,我只想让Camel将返回的地图内容转换为JSON并将其打印到控制台,如下所示:
{"fruit1DataType":"String","fruit1":"apple","fruit1Calories":"95","fruit1ColorDataType":"String","fruit1CaloriesDataType":"int","fruit1Color":"red"}, Out: null]
如何修改applicationContext.xml以让Camel执行此操作?
这是我当前的applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
<context:component-scan base-package="sample" />
<context:annotation-config />
<camel:camelContext id="HelloWorldContext">
<!-- Add Jackson library to render Java Map into JSON -->
<camel:dataFormats>
<camel:json id="jack" library="Jackson"/>
</camel:dataFormats>
<camel:route>
<!-- sends a request to the hello world JMS queue every 10 seconds -->
<camel:from
uri="timer://hello.world.request.timer?fixedRate=true&period=10000" />
<camel:to uri="log:hello.world.request?level=INFO?showAll=true" />
<camel:bean ref="helloWorld" />
<!-- now print out the map in JSON format -->
<camel:marshal ref ="jack"/>
<camel:to uri="log:hello.world.response?level=INFO?showAll=true" />
</camel:route>
</camel:camelContext>
<bean id="jms" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="configuration" ref="jmsConfig" />
</bean>
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="jmsConnectionFactory" />
<property name="transacted" value="false" />
<property name="concurrentConsumers" value="1" />
</bean>
<bean id="jmsConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
<property name="brokerURL" value="vm://localhost" />
<property name="redeliveryPolicy" ref="redeliveryPolicy" />
<property name="prefetchPolicy" ref="prefetchPolicy" />
</bean>
<bean id="prefetchPolicy" class="org.apache.activemq.ActiveMQPrefetchPolicy">
<property name="queuePrefetch" value="5" />
</bean>
<bean id="redeliveryPolicy" class="org.apache.activemq.RedeliveryPolicy">
<property name="maximumRedeliveries" value="1" />
<property name="backOffMultiplier" value="2" />
<property name="initialRedeliveryDelay" value="2000" />
</bean>
</beans>
答案 0 :(得分:1)
您的路线中需要Camel JSON endpoint才能将Map
序列化为JSON。该链接还显示了如何选择在您的端点中使用哪个序列化程序(Jackson是我认为的最佳选择)。
像这样的东西(不确切)
<camelContext>
<dataFormats>
<json id="serializer" library="Jackson"/>
</dataFormats>
<route>
<from uri="servlet:///test-camel"/>
<to uri="bean:someSpringBean"/>
<to uri="bean:anotherSpringBean"/>
<marshal ref="serializer"/>
</route>
</camelContext>
请注意,json
元素还为要序列化/反序列化的类型采用名为unmarshalTypeName
的属性。但是,如上面提到的链接中所述,默认为Map
。由于您有Map
,因此无需指定。
答案 1 :(得分:0)
您可以轻松地完成这项工作:
<route>
<from id="from1" uri="anyway" />
<marshal id="_marshal1">
<json library="Jackson"/>
</marshal>
<log id="_log1" message="${body}"/>
<to id="_to1" uri="mock:foo"/>
</route>
并在.pom
中导入依赖项<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
<version>2.9.2</version>
</dependency>