我绝对是Apache Camel的新手。我想创建一个非常简单的应用程序,它接受WS调用并使用JPA将有效负载保存到数据库中。 有效载荷的结构非常简单。根是一个婚姻对象。它包含一些String和int和Date字段,妻子,丈夫和子列表(Person对象)。
我的目标是将这些数据保存到数据库的两个表中:MARRIAGE,PERSON。
我已经成功创建了一个jaxws:endpoint,我在其中侦听并响应虚拟响应。 我已经创建了表和JPA实体。
我不知道如何将WS实现与Spring配置的JpaTemplate“连接”起来。我是否应该使用Camel路由以某种方式使用@Converter类或@Injet将其解决到Spring的WS实现类中。我很困惑。
我应该使用cxf端点而不是jaxws端点吗?
答案 0 :(得分:3)
如果要使用驼峰,则需要使用camle-cxf
端点。我要做的是将端点公开为camle-cxf
端点。像这样:
<camel-cxf:cxfEndpoint id="listenerEndpoint"
address="http://0.0.0.0:8022/Dummy/services/Dummy"
wsdlURL="wsdl/DummyService.wsdl"
xmlns:tns="http://dummy.com/ws/Dummy"
serviceName="tns:Dummy"
endpointName="tns:DummyService">
<camel-cxf:properties>
<entry key="schema-validation-enabled" value="true"/>
<entry key="dataFormat" value="PAYLOAD"/>
</camel-cxf:properties>
</camel-cxf:cxfEndpoint>
然后我会有一个像这样的简单的Spring bean:
<bean id="processor" class="com.dummy.DummyProcessor">
<property name="..." value="..."/> //there goes your data source of jdbc template or whatever...
</bean>
如果您想使用JPA
,只需配置所有配置并将实体管理器注入此bean。
实际的类看起来像这样:
public class DummyProcessor {
@Trancational //If you need transaction to be at this level...
public void processRequest(Exchange exchange) {
YourPayloadObject object = exchange.getIn().getBody(YourPayloadObject.class);
//object - is your object from SOAP request, now you can get all the data and store it in the database.
}
}
骆驼路线将是这样的:
<camel:camelContext trace="true" id="camelContext" >
<camel:route id="listenerEndpointRoute">
<camel:from uri="cxf:bean:listenerEndpoint?dataFormat=POJO&synchronous=true" />
<camel:log message="Got message. The expected operation is :: ${headers.operationName}"/>
<camel:choice>
<camel:when>
<camel:simple>${headers.operationName} == 'YourPayloadObject'</camel:simple>
<camel:bean ref="processor" method="processRequest"/>
</camel:when>
</camel:choice>
<camel:log message="Got message before sending to target: ${headers.operationName}"/>
<camel:to uri="cxf:bean:someTargetEndpointOrSomethingElse"/>
<camel:log message="Got message received from target ${headers.operationName}"/>
</camel:route>
</camel:camelContext>
希望这有帮助。