当前位置: 首页 > 知识库问答 >
问题:

Camel route,如何使用endpoint作为触发器,返回即时响应但继续流程?

干永丰
2023-03-14

我想用骆驼实现一种触发EIP。

我想要的是:我有一个web服务,它将充当骆驼路线的endpoint。这个服务接收一个请求,如果请求是格式良好的,它必须并行做两件事:用一个简单的消息“OK”或“ACK”向原始发送者返回一个响应,或者如果请求不是格式良好的,响应将是“NOK”或“RPT”(请求重复消息)。与此同时,如果消息是格式良好的,那么它必须被发送到另一个web服务,该web服务将使用一些信息来丰富原始消息,并将结果消息(或交换,我不确定这里的术语是否正确)发送到JMS实现。

我的endpoint充当进程的触发器,但必须立即向调用者返回响应。

所以我的问题是,我可以使用什么组件来做到这一点?我正在使用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.]

如果我只是在我的骆驼路线中使用其中一颗豆子,一切顺利,响应是我期望的。

我确信这是我的错误,我肯定使用了错误的组件,但我仍然没有找到解决方法,我感谢任何人能给我的帮助!

共有1个答案

糜宜民
2023-03-14

您是否研究过骆驼提供的Wiretap模式:

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

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

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

<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 应该为您指明正确的方向。

干杯尤格什

 类似资料:
  • 我正在尝试将SpringReactor与我的SpringBoot应用程序一起使用。 我正在使用ProjectReactor 3.0.7。松开并安装Spring护套1.5.3。释放 在我的服务类中有一个返回通量的方法。 我想将该值返回到web层中的控制器。但是,我没有看到json响应中返回的值。 当我从浏览器调用http://localhost:8080时,我得到的响应是,{“预取”:-1} 我不确

  • 问题内容: 我想返回axios的响应,但始终返回的响应是不确定的: 控制台始终记录为未定义。他们以任何方式返回此响应。 问题答案: console.log不会等到该功能完全完成后再进行记录。这意味着您将必须进行异步处理,主要有两种方法: 回调-这是当您将函数作为参数传递到现有函数中时,将在axios调用完成后执行。这是如何与您的代码一起使用的: Promise-实现此目的的最简单方法是将其放在函数

  • 我正在尝试使用改型和rxjava 2进行WebService调用。我在探索使用RxJava2的两种不同方法。问题是,当我使用可观察的,但不使用可流动的时,我得到了响应。使用Flowable时,日志没有打印出来。我试图调试它,但它没有进入下一步或完成中或错误中。仅执行订阅上的。 1) 使用observable作为返回类型 2)使用可流动作为返回类型 静止触点改装api 调用webservice 获取

  • 客户端通过HTTP请求(通过浏览器post)调用Servlet,然后Servlet应向外部网站发送请求(get),并从网站接收响应(post)。servlet继续响应并向客户端发送响应(post)。 我的问题是如何在Servlet中发送和接收请求/响应并将某些内容发送回客户端?

  • 我是SpringBoot的新手,正在寻找一种在endpoint超过3秒才能返回响应时超时的方法。我尝试添加属性“server.servlet.session.timeout”,但仍然没有运气。如何做到这一点?谢谢。 Application.properties

  • 我有一个函数,可以使用Pandas分析CSV文件并生成包含摘要信息的编辑器。我想从Flask视图返回结果作为响应。如何返回JSON响应?