我想用 Camel 来实现一种触发 EIP。
我想要的是:我有一个 Web 服务,它将充当骆驼路线端点。此服务接收请求,如果请求格式正确,它必须并行执行两件事:使用简单消息“OK”或“ACK”向原始发送者返回响应,或者在请求格式不正确的情况下响应将是“NOK”或“RPT”(要求重复该消息)。然后同时,如果消息格式正确,则必须将其发送到另一个 Web 服务,该服务将用一些信息丰富原始消息并发送结果消息(或 Exchange,我不确定这里的正确术语) 到 JMS 实现。
我的端点充当流程的触发器,但必须立即向调用者返回响应。
所以我的问题是,我可以使用什么组件来做到这一点?我正在使用 Spring DSL 实现路由。我开始使用:
<route>
<from uri="cxf:bean:clientEventEip?dataFormat=MESSAGE"/>
<multicast>
<to uri="bean:messageResponse"/><!-- checks the message and returns 'OK' -->
<to uri="bean:messageEnricher"/><!-- Enriches and sends msg to another WS -->
</multicast>
</route>
但我在客户端收到错误响应:
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<soap:Fault>
<faultcode>soap:Server</faultcode>
<faultstring>Exception occurred during execution on the exchange: Exchange[Message: [Body is instance of java.io.InputStream]]</faultstring>
</soap:Fault>
</soap:Body>
</soap:Envelope>
并且在 IDE 中有很多异常,例如:
org.apache.camel.CamelExecutionException
和
org.apache.camel.InvalidPayloadException: No body available of type: org.w3c.dom.Document but has value: org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb of type: null on: Message: [Body is instance of java.io.InputStream]. Caused by: Error during type conversion from type: null to the required type: org.w3c.dom.Document with value org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb due org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.. Exchange[Message: [Body is instance of java.io.InputStream]]. Caused by: [org.apache.camel.TypeConversionException - Error during type conversion from type: null to the required type: org.w3c.dom.Document with value org.apache.cxf.transport.http.AbstractHTTPDestination$1@b8c6fb due org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.]
如果我只是在我的骆驼路线中使用一种豆子一切顺利,那么响应就是我所期望的。
我确定这是我的错误,我一定是使用了错误的组件,但我仍然没有弄清楚如何解决这个问题,我感谢任何人能给我的帮助!