1

camel cxf プロデューサーを使用して nmr エンドポイント経由で通信する 2 つの別個のバンドルを取得しようとしています。私は一週間ずっとこれに取り組んできましたが、今のところうまくいきません。

ただし、例の cxf-camel-nmr と同じようにすべての nmr エンドポイントを問題なく使用できるため、バンドルが問題ないことがわかります。真剣に、これは非常に単純な Hello World のプロトタイプであり、動作させることができません。

どんな助けや提案も素晴らしいでしょう!!

Env: Java 1.5 Apache Servicemix 4.3.2 (バージン インストール)

servicemix には、2 つの個別の osgi バンドルがあります。camel 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

過去2日間、まったく同じ問題に取り組んでいるようです。私は今それを解決したと信じています。これが私が見つけたものです:

StaxUtils の NPE はsource( javax.xml.transform.Source)が原因のようnullです。クラスに戻ったnullときです。ここで、物事が少し醜くなります。一歩後退しましょう。exchange.getIn().getBody(Source.class)nullNMRDestination

TRACEメッセージが受信されたときに本文があったかどうかを確認するには、ログ レベルをオンにする必要があります。これは、コマンドを使用して servicemix コンソールで実行できますlog:set TRACEExchangeUtils#display(Exchange)DEBUG ではなく、TRACE で本文を出力するオプションでのみ呼び出されます。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()

TRACE ログを読んでいるときに、別の微妙な (ほぼ参考までに) トレース メッセージがorg.apache.xml.serializer.ToXMLStreamバンドルに表示されないことに気付きました。私は、NMR がメッセージを Source オブジェクトに変換できず、それについて何も教えてくれなかったと考えました。

解決策:私は最終的org.apache.xml.serializerImport-PackageMaven命令にorg.apache.xalan追加しました(シリアライザのインポートを追加すると、次に爆発したのはClassNotFountException不満でしたorg.apache.xalan.xsltc.trax.DOM2SAX)。すべてがランタイムにあり、すべてがlib/endorsed.

これで動作し、私のメッセージは宛先エンドポイントにあります。もう 1 つ注目すべきはstreamCache、Camel コンテンツの属性です。Camel の最新バージョンでは、デフォルトでストリーム リソースがキャッシュされないという問題があり、キャッシュされていない限り、コードはストリームから複数回読み取ることができません。

残っている問題は、NMR/Camel がメッセージをルートに送信するために必要な依存関係をサービスに「認識させる」必要があるのはなぜかということです。本当に意味がありません。

于 2012-03-10T15:26:07.907 に答える