2

我想用 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.]

如果我只是在我的骆驼路线中使用一种豆子一切顺利,那么响应就是我所期望的。

我确定这是我的错误,我一定是使用了错误的组件,但我仍然没有弄清楚如何解决这个问题,我感谢任何人能给我的帮助!

4

1 回答 1

1

您是否查看过 Camel 提供的 Wiretap 模式:

http://camel.apache.org/wire-tap.html

窃听本质上是获取您的交换副本并异步路由到不同的端点。上面的链接有更多详细信息。

您可以检查您的消息,如果没问题,您可以同时调用窃听端点和响应端点。像这样的东西:

<route>
  <from uri="cxf:bean:clientEventEip?dataFormat=MESSAGE"/>

    <wireTap uri="direct:tap"/>      

    <to uri="bean:messageResponse"/><!-- checks the message and returns 'OK' or 'NOK'-->

</route>

<route>
   <from uri="direct:enrichingRoute"/>
   <to uri="bean:messageEnricher"/><!-- Enriches and sends msg to another WS -->
</route>

在调用窃听之前,您可能需要添加一个过滤器来检查错误,但我认为窃听 EIP 应该为您指明正确的方向。

干杯,约格什

于 2012-12-12T04:23:27.560 回答