1

我一直在尝试让两个单独的包通过 nmr 端点使用骆驼 cxf 生产者进行通信。我整个星期都在做这个,到目前为止我还不能让它工作。

但是,我可以像示例 cxf-camel-nmr 中的所有 nmr 端点没有问题,所以我知道捆绑包是可以的。说真的,这是一个超级简单的 hello world 原型,我无法让它工作。

任何帮助或建议都会很棒!

环境:Java 1.5 Apache Servicemix 4.3.2(处女安装)

在 servicemix 中,我有两个单独的 osgi 包。我无法让我的骆驼 cxf 生产者成功调用 nmr 端点并且对如何修复的线索为零。

捆绑#1 cxf-nmr //消费者

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jaxws="http://cxf.apache.org/jaxws"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <import resource="classpath:META-INF/cxf/cxf.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
    <import resource="classpath:META-INF/cxf/transport/nmr/cxf-transport-nmr.xml" />

    <jaxws:endpoint id="helloWorld1"
                    implementor="org.apache.servicemix.examples.cxf.HelloWorldImpl"
                    address="nmr:HelloWorld1" />

</beans>

捆绑 #2 //生产者

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:osgi="http://www.springframework.org/schema/osgi"
       xmlns:camel="http://camel.apache.org/schema/spring"
       xmlns:cxf="http://camel.apache.org/schema/cxf"

       xsi:schemaLocation="
       http://camel.apache.org/schema/cxf http://camel.apache.org/schema/cxf/camel-cxf.xsd
       http://servicemix.apache.org/http/1.0 http://servicemix.apache.org/http/1.0/servicemix-http.xsd
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       http://www.springframework.org/schema/osgi  http://www.springframework.org/schema/osgi/spring-osgi.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml" />
  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
  <import resource="classpath:META-INF/cxf/transport/nmr/cxf-transport-nmr.xml" />  
  <import resource="classpath:org/apache/servicemix/camel/nmr/camel-nmr.xml" />
  <import resource="classpath:META-INF/cxf/cxf-extension-http.xml"/>

  <import resource="classpath:META-INF/cxf/cxf-extension-http-jetty.xml" />

  <camel:camelContext xmlns="http://camel.apache.org/schema/spring">
    <route>
      <from uri="cxf:bean:testEndpoint"/>
      <to uri="nmr:HelloWorld1"/>
    </route>
 </camel:camelContext>   
  <cxf:cxfEndpoint
        id="testEndpoint"
        address="http://localhost:9090/test"
        serviceClass="org.apache.servicemix.examples.cxf.HelloWorld">
        <cxf:properties>
            <entry key="dataFormat" value="PAYLOAD" />
        </cxf:properties>
    </cxf:cxfEndpoint>  
</beans>

--

#################
soap request response
#################
<?xml version="1.0"?>
<SOAP-ENV:Envelope
   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
   SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
   <SOAP-ENV:Body>
      <m:sayHi xmlns:m="http://cxf.examples.servicemix.apache.org/">
      <arg0>foobar</arg0>
      </m:sayHi>
   </SOAP-ENV:Body>  
</SOAP-ENV:Envelope>

STATUS: 500
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><soap:Fault><faultcode>soap:Server</faultcode><faultstring>java.lang.NullPointerException</faultstring></soap:Fault></soap:Body></soap:Envelope>

--

####################
Console Output - No Idea How To Fix
####################

18:56:04,544 | ERROR | oWorld1-thread-1 | NMRDestination                   |  -  -  | error preparing message
java.lang.NullPointerException
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1183)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:427)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:380)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.servicemix.cxf.transport.nmr.NMRMessageHelper.convertMessageToInputStream(NMRMessageHelper.java:43)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:127)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.nmr.core.InternalEndpointWrapper.process(InternalEndpointWrapper.java:86)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl.process(ChannelImpl.java:255)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl$1.run(ChannelImpl.java:215)[83:org.apache.servicemix.nmr.core:1.4.0]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)[:1.5.0_22]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)[:1.5.0_22]
    at java.lang.Thread.run(Thread.java:595)[:1.5.0_22]
18:56:04,547 | WARN  | oWorld1-thread-1 | NMR                              | 83 - org.apache.servicemix.nmr.core - 1.4.0 | Error processing exchange [
  id:        a778d16c-2955-41de-89e8-7775f4f976bf
  mep:       InOut
  status:    Active
  role:      Provider
  target:    PropertyMatchingReference[{NAME=HelloWorld1}]
  properties: [
      jaxwsContext = {javax.xml.ws.wsdl.operation={http://cxf.examples.servicemix.apache.org/}sayHi, javax.xml.ws.wsdl.description=http://localhost:9090/test?wsdl, javax.xml.ws.wsdl.service={http://cxf.examples.servicemix.apache.org/}HelloWorldService, javax.xml.ws.wsdl.interface={http://cxf.examples.servicemix.apache.org/}HelloWorld, javax.xml.ws.wsdl.port={http://cxf.examples.servicemix.apache.org/}HelloWorldPort}
      CamelToEndpoint = nmr://HelloWorld1
      org.apache.cxf.service.model.BindingOperationInfo = [BindingOperationInfo: {http://cxf.examples.servicemix.apache.org/}sayHi]
      mtom-enabled = false
      CamelCreatedTimestamp = Thu Jun 09 18:56:04 PDT 2011
      CamelCXFDataFormat = PAYLOAD
  ]
]

org.apache.servicemix.nmr.api.ServiceMixException: java.lang.NullPointerException
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:151)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.nmr.core.InternalEndpointWrapper.process(InternalEndpointWrapper.java:86)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl.process(ChannelImpl.java:255)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl$1.run(ChannelImpl.java:215)[83:org.apache.servicemix.nmr.core:1.4.0]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)[:1.5.0_22]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)[:1.5.0_22]
    at java.lang.Thread.run(Thread.java:595)[:1.5.0_22]
Caused by: java.lang.NullPointerException
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1183)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:427)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:380)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.servicemix.cxf.transport.nmr.NMRMessageHelper.convertMessageToInputStream(NMRMessageHelper.java:43)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:127)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    ... 6 more
18:56:04,552 | ERROR | f2d4607-thread-1 | DefaultErrorHandler              | 68 - org.apache.camel.camel-core - 2.6.0 | Failed delivery for exchangeId: ID-Dana-PC-45880-1307670949817-0-2. Exhausted after delivery attempt: 1 caught: org.apache.servicemix.nmr.api.ServiceMixException: java.lang.NullPointerException
org.apache.servicemix.nmr.api.ServiceMixException: java.lang.NullPointerException
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:151)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.nmr.core.InternalEndpointWrapper.process(InternalEndpointWrapper.java:86)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl.process(ChannelImpl.java:255)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl$1.run(ChannelImpl.java:215)[83:org.apache.servicemix.nmr.core:1.4.0]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)[:1.5.0_22]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)[:1.5.0_22]
    at java.lang.Thread.run(Thread.java:595)[:1.5.0_22]
Caused by: java.lang.NullPointerException
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1183)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:427)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:380)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.servicemix.cxf.transport.nmr.NMRMessageHelper.convertMessageToInputStream(NMRMessageHelper.java:43)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:127)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    ... 6 more
18:56:04,553 | WARN  | qtp407691725-242 | PhaseInterceptorChain            |  -  -  | Interceptor for {http://cxf.examples.servicemix.apache.org/}HelloWorldService#{http://cxf.examples.servicemix.apache.org/}sayHi has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: java.lang.NullPointerException
    at org.apache.camel.component.cxf.CxfConsumer$1.checkFailure(CxfConsumer.java:219)[118:org.apache.camel.camel-cxf:2.6.0]
    at org.apache.camel.component.cxf.CxfConsumer$1.setResponseBack(CxfConsumer.java:196)[118:org.apache.camel.camel-cxf:2.6.0]
    at org.apache.camel.component.cxf.CxfConsumer$1.asyncInvoke(CxfConsumer.java:116)[118:org.apache.camel.camel-cxf:2.6.0]
    at org.apache.camel.component.cxf.CxfConsumer$1.invoke(CxfConsumer.java:73)[118:org.apache.camel.camel-cxf:2.6.0]
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:93)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.phase.PhaseInterceptorChain.resume(PhaseInterceptorChain.java:224)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:70)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.serviceRequest(JettyHTTPDestination.java:311)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPDestination.doService(JettyHTTPDestination.java:280)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.transport.http_jetty.JettyHTTPHandler.handle(JettyHTTPHandler.java:72)[116:org.apache.cxf.bundle:2.3.2]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:931)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:868)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:185)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:114)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.Server.handleAsync(Server.java:397)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:601)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.server.HttpConnection.handle(HttpConnection.java:410)[149:org.eclipse.jetty.server:7.2.2.v20101205]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:508)[144:org.eclipse.jetty.io:7.2.2.v20101205]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint.access$000(SelectChannelEndPoint.java:34)[144:org.eclipse.jetty.io:7.2.2.v20101205]
    at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:40)[144:org.eclipse.jetty.io:7.2.2.v20101205]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:451)[143:org.eclipse.jetty.util:7.2.2.v20101205]
    at java.lang.Thread.run(Thread.java:595)[:1.5.0_22]
Caused by: org.apache.servicemix.nmr.api.ServiceMixException: java.lang.NullPointerException
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:151)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.nmr.core.InternalEndpointWrapper.process(InternalEndpointWrapper.java:86)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl.process(ChannelImpl.java:255)[83:org.apache.servicemix.nmr.core:1.4.0]
    at org.apache.servicemix.nmr.core.ChannelImpl$1.run(ChannelImpl.java:215)[83:org.apache.servicemix.nmr.core:1.4.0]
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:651)[:1.5.0_22]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:676)[:1.5.0_22]
    ... 1 more
Caused by: java.lang.NullPointerException
    at org.apache.cxf.staxutils.StaxUtils.createXMLStreamReader(StaxUtils.java:1183)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:427)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.cxf.staxutils.StaxUtils.copy(StaxUtils.java:380)[116:org.apache.cxf.bundle:2.3.2]
    at org.apache.servicemix.cxf.transport.nmr.NMRMessageHelper.convertMessageToInputStream(NMRMessageHelper.java:43)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    at org.apache.servicemix.cxf.transport.nmr.NMRDestination.process(NMRDestination.java:127)[203:org.apache.servicemix.cxf.transport.nmr:4.3.0]
    ... 6 more
4

1 回答 1

1

在过去的两天里,我似乎一直在处理完全相同的问题。我相信我现在已经解决了。这是我发现的:

StaxUtils 中的 NPE 似乎是由于source( javax.xml.transform.Source) 存在null。它可以是在课堂上返回的null时候。这就是事情变得有点丑陋的地方。让我们退后一步。exchange.getIn().getBody(Source.class)nullNMRDestination

要查看您的消息在进入时是否有正文,您需要打开TRACE日志级别。您可以使用log:set TRACE命令在 servicemix 控制台中执行此操作。ExchangeUtils#display(Exchange)只有在 TRACE 中打印出正文的选项时才会调用,甚至在 DEBUG 中也不会。启用 TRACE 后,您将看到如下内容:

 id:        1520804564-51998-1331328769981-0-3
  mep:       InOut
  status:    Active
  role:      Consumer
  target:    ...
  properties: [ ]
  In: [
      content:
      ]

In.content部分本质上是消息的正文。我相信你的交易所和我的一样有一个身体。这意味着它在 NMR/Camel 路由模式中的某个地方“丢失”了。

通过exchange.getIn().getBody(Source.class)一个特殊的转换逻辑,如果没有点击,它可能会默默地(!)返回 null。看看org.apache.camel.impl.converter.BaseTypeConverterRegistry#doConvertTo()

org.apache.xml.serializer.ToXMLStream当我阅读 TRACE 日志时,我注意到另一个关于我的包不可见的微妙(几乎是仅供参考)的跟踪消息。我认为 NMR 未能将消息转换为 Source 对象,并且什么也没告诉我。

解决方案:我最终添加org.apache.xml.serializer了我的Import-Packagemaven 指令org.apache.xalan(一旦我添加了序列化程序导入,下一个爆炸的事情就是ClassNotFountException抱怨org.apache.xalan.xsltc.trax.DOM2SAX)。一切都在运行时,一切都在lib/endorsed,直到现在我的服务包才看到它。

它现在可以工作了,我的消息在目标端点。还有一点需要注意的是streamCacheCamel 内容的属性。在最新版本的 Camel 中,默认情况下不会缓存流资源,您的代码将无法从流中多次读取,除非它被缓存。

剩下的问题是为什么我必须让服务“意识到”NMR/Camel 需要将我的消息发送到该路线上的那些依赖关系。真的没有意义。

于 2012-03-10T15:26:07.907 回答