【问题标题】:Capturing apache camel route cxf web response捕获 apache camel route cxf web 响应
【发布时间】:2014-04-28 11:16:09
【问题描述】:

我是 Stack Overflow 和 Apache Camel 路由的新手,遇到了一些麻烦。我创建了一个非常简单的 SOAP Web 服务,它接受一个包含一些随机文本的 XML 请求,然后在响应中返回相同的字符串。

使用 Camel,我可以将请求发送到 Web 服务并获得响应(如果我使用日志组件来捕获请求/响应。

理想情况下,我想将 XML 消息(message1.xml、message2.xml、message3.xml)发送到 web 服务,然后处理它们并将响应存储在文件中:src/data/responses/(message1.xml, message2.xml、message3.xml)等等。我认为这可能就像在我的路线中添加一个额外的步骤一样简单(见下文)。

<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:src/data?noop=true" />
<log loggingLevel="INFO" message="${body}"/>
<to uri="cxf://http://localhost:8181/cxf/webservice?wsdlURL=src/main/resources/META-INF/webservice.wsdl&amp;serviceName={http://carose.com/}EchoServiceImplService&amp;portName={http://carose.com/}EchoServiceImplPort&amp;dataFormat=MESSAGE"/>
<log loggingLevel="INFO" message="${body}"/>
<to uri="file:src/data/responses" />
</route>
</camelContext>

但是,当我使用 mvn camel:run 运行路由时,它会在 /responses/ 文件夹中为每条消息创建一个空白 XML 文件。执行路由时显示如下错误信息:

[           default-workqueue-1] route1                         INFO  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:echoTextResponse xmlns:ns2="http://carose.com/"><return>Hello this is a test 123</return></ns2:echoTextResponse></soap:Body></soap:Envelope>
[           default-workqueue-2] route1                         INFO  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:echoTextResponse xmlns:ns2="http://carose.com/"><return>this is another test!</return></ns2:echoTextResponse></soap:Body></soap:Envelope>
[           default-workqueue-3] route1                         INFO  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:echoTextResponse xmlns:ns2="http://carose.com/"><return>and another test!</return></ns2:echoTextResponse></soap:Body></soap:Envelope>
[           default-workqueue-2] DefaultErrorHandler            ERROR Failed delivery for (MessageId: ID-christophersair-lan-53992-1398682968504-0-9 on ExchangeId: ID-christophersair-lan-53992-1398682968504-0-4). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: src/data/responses/message2.xml

消息历史记录

RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route1            ] [route1            ] [file://src/data?noop=true                                                     ] [        26]
[route1            ] [log1              ] [log                                                                           ] [         1]
[route1            ] [to1               ] [cxf://http://localhost:8181/cxf/webservice?wsdlURL=src/main/resources/META-INF] [        15]
[route1            ] [log2              ] [log                                                                           ] [         3]
[route1            ] [to2               ] [file:src/data/responses                                                       ] [         5]

交流

Exchange[
Id                  ID-christophersair-lan-53992-1398682968504-0-4
ExchangePattern     InOnly
Headers             {breadcrumbId=ID-christophersair-lan-53992-1398682968504-0-3, CamelCxfMessage={org.apache.cxf.client=true, org.apache.cxf.message.inbound=true, org.apache.cxf.message.Message.PROTOCOL_HEADERS={content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.6.7.v20120910)], transfer-encoding=[chunked]}, Content-Type=text/xml;charset=UTF-8, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.URLConnectionHTTPConduit2125068082target: http://localhost:8181/cxf/webservice, org.apache.cxf.ws.policy.AssertionInfoMap={}, org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@48a43495, org.apache.cxf.message.Message.RESPONSE_CODE=200, org.apache.cxf.message.Message.ENCODING=UTF-8}, CamelFileAbsolute=false, CamelFileAbsolutePath=/Users/christopherrose/RedHat/SG Project/webservice-client/camel-wsclient/src/data/message2.xml, CamelFileLastModified=1398259868000, CamelFileLength=337, CamelFileName=message2.xml, CamelFileNameConsumed=message2.xml, CamelFileNameOnly=message2.xml, CamelFileParent=src/data, CamelFilePath=src/data/message2.xml, CamelFileRelativePath=message2.xml, CamelRedelivered=false, CamelRedeliveryCounter=0, content-type=text/xml;charset=UTF-8, ResponseContext={org.apache.cxf.client=true, org.apache.cxf.message.Message.PROTOCOL_HEADERS={content-type=[text/xml;charset=UTF-8], Server=[Jetty(7.6.7.v20120910)], transfer-encoding=[chunked]}, org.apache.cxf.message.inbound=true, Content-Type=text/xml;charset=UTF-8, org.apache.cxf.message.Message.ENCODING=UTF-8, org.apache.cxf.message.Message.RESPONSE_CODE=200, org.apache.cxf.binding.soap.SoapVersion=org.apache.cxf.binding.soap.Soap11@48a43495, org.apache.cxf.ws.policy.AssertionInfoMap={}, org.apache.cxf.transport.Conduit=conduit: class org.apache.cxf.transport.http.URLConnectionHTTPConduit2125068082target: http://localhost:8181/cxf/webservice}, Server=Jetty(7.6.7.v20120910), transfer-encoding=chunked}
BodyType            sun.net.www.protocol.http.HttpURLConnection.HttpInputStream
Body                [Body is instance of java.io.InputStream]

]

堆栈跟踪

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: src/data/responses/message2.xml
at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:269)
at         org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277)
at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165)
at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:79)
at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:113)
at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:72)
at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:398)
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:118)
at org.apache.camel.processor.Pipeline.access$100(Pipeline.java:43)
at org.apache.camel.processor.Pipeline$1.done(Pipeline.java:136)
at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:251)
at org.apache.camel.processor.RedeliveryErrorHandler$1.done(RedeliveryErrorHandler.java:410)
at org.apache.camel.management.InstrumentationProcessor$1.done(InstrumentationProcessor.java:81)
at org.apache.camel.processor.SendProcessor$1.done(SendProcessor.java:123)
at org.apache.camel.component.cxf.CxfClientCallback.handleResponse(CxfClientCallback.java:63)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:856)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1614)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream$1.run(HTTPConduit.java:1129)
at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$3.run(AutomaticWorkQueueImpl.java:428)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.cxf.workqueue.AutomaticWorkQueueImpl$AWQThreadFactory$1.run(AutomaticWorkQueueImpl.java:353)
at java.lang.Thread.run(Thread.java:744)
Caused by: java.io.IOException: stream is closed
at sun.net.www.http.ChunkedInputStream.ensureOpen(ChunkedInputStream.java:174)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:673)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3053)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3047)
at org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:375)
at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:263)
... 24 more
[           default-workqueue-3] DefaultErrorHandler            ERROR Failed delivery for (MessageId: ID-christophersair-lan-53992-1398682968504-0-7 on ExchangeId: ID-christophersair-lan-53992-1398682968504-0-6). Exhausted after delivery attempt: 1 caught: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot store file: src/data/responses/message3.xml

我假设它可能无法检索响应并将其存储在一个文件中,或者可能有一些东西可以让我指出方向?

感谢您的帮助!

【问题讨论】:

  • 你能仔细检查 src/data 目录中的 message2.xml 吗?
  • 如何在fuse ide中执行root?

标签: xml web-services maven components apache-camel


【解决方案1】:

使用 Camel v2.12.2,我没有收到异常,但是在记录正文内容时文件为空。这是因为流只能读取一次,请参阅here。因此,在使用 CXF 网络服务后删除日志:

<camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="file:src/data?noop=true" />
        <log loggingLevel="INFO" message="${body}"/>
        <to uri="cxf://http://localhost:8181/cxf/webservice?wsdlURL=src/main/resources/META-INF/webservice.wsdl&amp;serviceName={http://carose.com/}EchoServiceImplService&amp;portName={http://carose.com/}EchoServiceImplPort&amp;dataFormat=MESSAGE"/>
        <!-- do not log the body or the file written will be empty
        <log loggingLevel="INFO" message="${body}"/>
        -->
        <to uri="file:src/data/responses?fileName=output.txt" />
    </route>
</camelContext>

除此之外,我添加了fileName 选项以获得一个好听的文件名。

【讨论】:

    【解决方案2】:

    我不确定您的 message2.xml 是否调用单向服务。 您可以仔细检查 src/data 目录中的 message2.xml 吗? 如果是单向消息或无效的soap请求,您可能无法获得所需的正确输入流。

    【讨论】:

    • 谢谢,我刚刚尝试将 streamCache = true 属性添加到路由中,这似乎解决了我的问题 :)
    【解决方案3】:

    我想我已经设法修复它..

    我认为这可能是由于响应在路由期间没有被缓存或存储在任何地方,导致它创建了空白文件(message1.xml、message2.xml 和 message3.xml)。我发现有一个可以设置的流缓存设置,所以我打开了它,现在它正在创建所有三个文件,其中包含正确的 XML 响应。请参阅下面的路由 XML:

    <camelContext xmlns="http://camel.apache.org/schema/spring">
    <route streamCache="true">
        <from uri="file:src/data?noop=true" />
        <log loggingLevel="INFO" message="${body}"/>
        <to uri="cxf://http://localhost:8181/cxf/webservice?wsdlURL=src/main/resources/META-INF/webservice.wsdl&amp;serviceName={http://carose.com/}EchoServiceImplService&amp;portName={http://carose.com/}EchoServiceImplPort&amp;dataFormat=MESSAGE"/>
        <log loggingLevel="INFO" message="${body}"/>
        <to uri="file:src/data/responses" />
    </route>
    

    感谢您的建议:)

    【讨论】:

      猜你喜欢
      • 2014-02-07
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多