2016-04-08 15 views
3

初心者を送信するとき、私たちはESBとしての中心点としてそれを使用し始めるが、我々は、単純なケースを実行して、現実的な問題に直面している:/[WSO2 ESB] [4.9.0] NPE反復処理に戻ってWSO2 ESB上

ここで私のユースケースが違っていても私の問題を示すために私が書いたapi(based on that simple)です。

  1. ユーザー

<?xml version="1.0" encoding="UTF-8" ?> 
 
<api context="/services/users" name="ListUsersAPI" xmlns="http://ws.apache.org/ns/synapse"> 
 
    <resource methods="GET" protocol="http" url-mapping="/*"> 
 
    <inSequence> 
 
     <payloadFactory media-type="json"> 
 
     <format>{ "persons":{ "person":[ { "Id":"1", "givenName":"ajith", "lastName":"vitharana", "age":"25", "contactInfos":[ { "InfoId":"1", "department":"1", "contactType":"email", "value":"[email protected]" }, { "InfoId":"2", "department":"1", "contactType":"mobile", 
 
      "value":"111111111" }, { "InfoId":"3", "department":"1", "contactType":"home", "value":"Magic Dr,USA" } ] }, { "Id":"2", "givenName":"shammi", "lastName":"jagasingha", "age":"30", "contactInfos":[ { "InfoId":"1", "department":"1", "contactType":"email", 
 
      "value":"[email protected]" }, { "InfoId":"2", "department":"1", "contactType":"mobile", "value":"2222222222" }, { "InfoId":"3", "department":"1", "contactType":"home", "value":"Magic Dr,USA" } ] } ] }}</format> 
 
     <args/> 
 
     </payloadFactory> 
 
     <property action="remove" name="NO_ENTITY_BODY" scope="axis2" /> 
 
     <property name="messageType" scope="axis2" type="STRING" value="application/json" /> 
 
     <respond/> 
 
    </inSequence> 
 
    <outSequence/> 
 
    <faultSequence/> 
 
    </resource> 
 
</api>

  • ロール
  • <?xml version="1.0" encoding="UTF-8" ?> 
     
    <api context="/services/roles" name="UserRolesAPI" xmlns="http://ws.apache.org/ns/synapse"> 
     
        <resource methods="GET" protocol="http" uri-template="/{personid}"> 
     
        <inSequence> 
     
         <filter regex="1" source="get-property('uri.var.personid')"> 
     
         <then> 
     
          <payloadFactory media-type="json"> 
     
          <format>{ "Id":1, "roles":[ { "roleId":1, "personKey":1, "role":"Deverloper" }, { "roleId":2, "personKey":1, "role":"Engineer" } ]}</format> 
     
          <args/> 
     
          </payloadFactory> 
     
          <property action="remove" name="NO_ENTITY_BODY" scope="axis2" /> 
     
          <property name="messageType" scope="axis2" type="STRING" value="application/json" /> 
     
          <respond/> 
     
         </then> 
     
         <else/> 
     
         </filter> 
     
         <filter regex="2" source="get-property('uri.var.personid')"> 
     
         <then> 
     
          <payloadFactory media-type="json"> 
     
          <format>{"personId": 2,"roles": [{ "personRoleId": 1, "personKey": 2, "role": "Manager" },{ "personRoleId": 2, "personKey": 2, "role": "QA" }]}</format> 
     
          <args/> 
     
          </payloadFactory> 
     
          <property action="remove" name="NO_ENTITY_BODY" scope="axis2" /> 
     
          <property name="messageType" scope="axis2" type="STRING" value="application/json" /> 
     
          <respond/> 
     
         </then> 
     
         <else/> 
     
         </filter> 
     
        </inSequence> 
     
        <outSequence/> 
     
        <faultSequence/> 
     
        </resource> 
     
    </api>
    01

      1. 最後に、最初のものを呼び出す主なものは、最後のAPI(http://localhost:8280/userdetails)を実行

      <?xml version="1.0" encoding="UTF-8" ?> 
       
      <api context="/userdetails" name="UserDetailsAPI" xmlns="http://ws.apache.org/ns/synapse"> 
       
          <resource methods="GET" protocol="http"> 
       
          <inSequence> 
       
           <call> 
       
           <endpoint> 
       
            <http method="get" trace="disable" uri-template="http://localhost:8280/services/users" /> 
       
           </endpoint> 
       
           </call> 
       
           <iterate attachPath="//jsonObject/persons" expression="//jsonObject/persons/person" id="it1" preservePayload="true" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
       
           <target> 
       
            <sequence> 
       
            <property expression="$body/jsonObject/persons/person/Id" name="uri.var.Id" scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd" /> 
       
            <property expression="$body//jsonObject//person" name="response1" scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd" /> 
       
            <call> 
       
             <endpoint> 
       
             <http method="get" trace="disable" uri-template="http://localhost:8280/services/roles/{uri.var.Id}" /> 
       
             </endpoint> 
       
            </call> 
       
            <loopback/> 
       
            </sequence> 
       
           </target> 
       
           </iterate> 
       
          </inSequence> 
       
          <outSequence> 
       
           <send/> 
       
          </outSequence> 
       
          <faultSequence> 
       
           <sequence key="fault" /> 
       
          </faultSequence> 
       
          </resource> 
       
      </api>

      ある反復します次のNPEが発生します。

      20160408T101619.566 org.apache.synapse.transport.passthru.PassThroughHttpSender.handleException(PassThroughHttpSender.java:609) [PassThroughMessageProcessor-14] PassThroughHttpSender - Failed to submit the response 
      java.lang.NullPointerException 
          at org.apache.synapse.transport.passthru.util.SourceResponseFactory.create(SourceResponseFactory.java:64) 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:462) 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:267) 
          at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) 
          at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:212) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:444) 
          at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:102) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48) 
          at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:149) 
          at org.apache.synapse.rest.Resource.process(Resource.java:297) 
          at org.apache.synapse.rest.API.process(API.java:335) 
          at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:97) 
          at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:52) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:266) 
          at org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediator.java:55) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
          at org.apache.synapse.mediators.eip.splitter.IterateMediator.mediate(IterateMediator.java:241) 
          at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:267) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:679) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:244) 
          at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:529) 
          at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:172) 
          at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
          at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:251) 
          at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
          at java.lang.Thread.run(Thread.java:745) 
      20160408T101619.576 org.apache.synapse.core.axis2.Axis2Sender.handleException(Axis2Sender.java:246) [PassThroughMessageProcessor-14]  Axis2Sender - Accept:*/*,Accept-Encoding:gzip, deflate, sdch,Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,Cache-Control:no-cache,Content-Type:application/json; charset=UTF-8,Host:localhost:8280,Postman-Token:3bfb96b7-0c31-964e-8c37-3b5dbd222efe,<?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject><Id>1</Id><roles><roleId>1</roleId><personKey>1</personKey><role>Deverloper</role></roles><roles><roleId>2</roleId><personKey>1</personKey><role>Engineer</role></roles></jsonObject></soapenv:Body></soapenv:Envelope> Unexpected error sending message back 
      org.apache.axis2.AxisFault: Failed to submit the response 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.handleException(PassThroughHttpSender.java:610) 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:269) 
          at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) 
          at org.apache.synapse.core.axis2.Axis2Sender.sendBack(Axis2Sender.java:212) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:444) 
          at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:102) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:48) 
          at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:149) 
          at org.apache.synapse.rest.Resource.process(Resource.java:297) 
          at org.apache.synapse.rest.API.process(API.java:335) 
          at org.apache.synapse.rest.RESTRequestHandler.dispatchToAPI(RESTRequestHandler.java:97) 
          at org.apache.synapse.rest.RESTRequestHandler.process(RESTRequestHandler.java:52) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:266) 
          at org.apache.synapse.mediators.builtin.LoopBackMediator.mediate(LoopBackMediator.java:55) 
          at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
          at org.apache.synapse.mediators.eip.splitter.IterateMediator.mediate(IterateMediator.java:241) 
          at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:267) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.mediateFromContinuationStateStack(Axis2SynapseEnvironment.java:679) 
          at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:244) 
          at org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:529) 
          at org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:172) 
          at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) 
          at org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:251) 
          at org.apache.axis2.transport.base.threads.NativeWorkerPool$1.run(NativeWorkerPool.java:172) 
          at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
          at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
          at java.lang.Thread.run(Thread.java:745) 
      Caused by: java.lang.NullPointerException 
          at org.apache.synapse.transport.passthru.util.SourceResponseFactory.create(SourceResponseFactory.java:64) 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.submitResponse(PassThroughHttpSender.java:462) 
          at org.apache.synapse.transport.passthru.PassThroughHttpSender.invoke(PassThroughHttpSender.java:267) 
          ... 26 more 
      

      私は恐怖ですが、これはhereと同じ問題ですが、わかりません。 私たちがwso2を離れることにする前に、すぐに避けるためにを手伝ってもらえますか? 3番目の部分(userdetails)を回答で修正する方が良いでしょう。

      ありがとうございました!

    +0

    ベンジャミン、私は、第三の部分を理解しようとしている - あなたは、コールを行い、その後、ループバックを行い、バックoutSequenceでをトリガー反復メディエーターを持っています。このシナリオでは、http:// localhost:8280/services/roles/{uri.var.Id}エンドポイントを反復して呼び出すだけで、 "out only"呼び出しとして呼び出すだけで、前にすべての応答を集約する必要はありませんでクライアントに返信しますか? – RaviU

    +0

    私の最終目標では、内部コール(ロール)をフィルタリングして、サードパーティサービスでデータを挿入する別の「外部のみ」コールを呼び出す必要があります。しかしここでは、それはNPEを示すために単純化されたサンプルでした。私は本当に何がクライアントに送り返されても構いません。あなたは成功しましたか(集計の有無にかかわらず)、あるいはNPEを持っていますか? –

    +0

    私のconfigsを通ってあなたに連絡しましょう。 – RaviU

    答えて

    2

    この場合、ループバックは反復仲介者の内部にあり、反復するたびにoutSequenceを呼び出すことになります。

    以下に示すように、ループバックメディエータを反復処理から移動する場合は、反復処理からの最後の応答をクライアントに送信する必要があります。反復からの応答を集計する場合は、集約メディエータ[1]を使用する必要があります。 の反復が完了するたびに、流れが継続するので、我々はループバックを持っている場合でもので、

    残念ながら、上記の解決策は動作しませんを更新しました[1] https://docs.wso2.com/display/ESB490/Aggregate+Mediator

    iterateの外側では、outSequenceを複数回呼び出すことになります。一度outSequenceをトリガするために完全な条件を使用できるようにするには、集約を使用する必要があります。以下の設定をご覧ください。

    <api xmlns="http://ws.apache.org/ns/synapse" name="UserDetailsAPI" context="/userdetails"> 
        <resource methods="GET"> 
         <inSequence> 
         <call> 
          <endpoint> 
           <http trace="disable" method="GET" uri-template="http://localhost:8280/services/users"/> 
          </endpoint> 
         </call> 
         <iterate xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" id="it1" preservePayload="true" attachPath="//jsonObject/persons" expression="//jsonObject/persons/person"> 
          <target> 
           <sequence> 
            <property xmlns:ns="http://org.apache.synapse/xsd" name="uri.var.Id" expression="$body/jsonObject/persons/person/Id" scope="default" type="STRING"/> 
            <property xmlns:ns="http://org.apache.synapse/xsd" name="response1" expression="$body//jsonObject//person" scope="default" type="STRING"/> 
            <call> 
            <endpoint> 
             <http trace="disable" method="GET" uri-template="http://localhost:8280/services/roles/{uri.var.Id}"/> 
            </endpoint> 
            </call> 
           </sequence> 
          </target> 
         </iterate> 
         <aggregate id="it1"> 
          <completeCondition> 
           <messageCount min="-1" max="-1"/> 
          </completeCondition> 
          <onComplete expression="//jsonObject"> 
           <loopback/> 
          </onComplete> 
         </aggregate> 
         </inSequence> 
         <outSequence> 
         <send/> 
         </outSequence> 
         <faultSequence> 
         <sequence key="fault"/> 
         </faultSequence> 
        </resource> 
    </api> 
    
    +0

    私はちょうどあなたのコードをコピーして貼り付けましたが(ループパのための場所を見ましたが)、私はそれを再現しました。同じ問題が発生しました:[2016-04-08 11:34:05,716]エラー - PassThroughHttpSenderが応答を送信できませんでした java.lang.NullPointerException \t at org.apache.synapse.transport.passthru.util.SourceResponseFactory.create(SourceResponseFactory .java:64) –

    +0

    パーフェクト。だから間違いなく、集約は仕事です!すばやく効率的な答えをいただきありがとうございます。 –

    関連する問題