2017-10-03 3 views
0

ich ziemlich neu bin in WSO2 EI und ich finde ein Problem einen DSS Service aus einer API in meinem ESB Fluss definiert nennen will.Warum erhalte ich diesen Fehler, wenn ich versuche, eine DSS-Abfrage aus meinem ESB-API-Fluss auszuführen? Die Endpunkt-Referenz (EPR) für den Betrieb nicht gefunden

ich auf diese Weise getan haben:

1) in die agrimarketprice-dss.dbs Datei DSS Dienst Ich habe diese Operation meiner Zusammenhang:

<operation name="GetCommodityDetails"> 
    <call-query href="SelectCommodityDetails"> 
     <with-param name="commodity_details_id" query-param="commodity_details_id"/> 
    </call-query> 
</operation> 

, dass Anrufe eine Abfrage mit id = commodity_details_id. Es funktioniert gut, ich testete es mit dem Try It Werkzeug und ich erhalte die erwartete Ergebnismenge.

2) Diese API definiert Ich habe dann von diesem ESB Fluss definiert:

<?xml version="1.0" encoding="UTF-8"?> 
<api context="/commodity_details" name="commodity_details" xmlns="http://ws.apache.org/ns/synapse"> 
    <resource methods="GET" protocol="http" uri-template="/{commodityId}"> 
     <inSequence> 
      <property expression="get-property('uri.var.commodityId')" name="commodityId" scope="default" type="STRING"/> 
      <log level="custom"/> 
      <log description="commodity_details" level="custom" separator="-"> 
       <property name="commodity_details" value="'commodity_details START'"/> 
      </log> 
      <log level="custom"> 
       <property expression="$ctx:commodityId" name="COMMODITY ID"/> 
      </log> 

      <property name="messageType" scope="axis2" type="STRING" value="application/xml"/> 
      <payloadFactory media-type="xml"> 
       <format> 
        <ds:GetCommodityDetails xmlns:ds="http://ws.wso2.org/dataservice"> 
         <ds:commodity_details_id>$1</ds:commodity_details_id> 
        </ds:GetCommodityDetails> 
       </format> 
       <args> 
        <arg evaluator="xml" expression="$ctx:commodityId" xmlns:ds="http://ws.wso2.org/dataservice" xmlns:ns="http://org.apache.synapse/xsd"/> 
       </args> 
      </payloadFactory> 
      <header name="Action" scope="default" value="urn:GetCommodityDetails"/> 
      <call> 
       <endpoint key="agrimarketprice_Endpoint"/> 
      </call> 
     </inSequence> 
     <outSequence/> 
     <faultSequence/> 
    </resource> 
</api> 

Wie Sie im vorherigen ESB fließen sehen kann Ich versuche, die vorhergehende Operation definiert in mein DSS Dienst rufen auf diese Weise:

<property name="messageType" scope="axis2" type="STRING" value="application/xml"/> 
<payloadFactory media-type="xml"> 
    <format> 
     <ds:GetCommodityDetails xmlns:ds="http://ws.wso2.org/dataservice"> 
      <ds:commodity_details_id>$1</ds:commodity_details_id> 
     </ds:GetCommodityDetails> 
    </format> 
    <args> 
     <arg evaluator="xml" expression="$ctx:commodityId" xmlns:ds="http://ws.wso2.org/dataservice" xmlns:ns="http://org.apache.synapse/xsd"/> 
    </args> 
</payloadFactory> 
<header name="Action" scope="default" value="urn:GetCommodityDetails"/> 
<call> 
    <endpoint key="agrimarketprice_Endpoint"/> 
</call> 

So bin ich eine Nutzlast Erstellung der abgerufenen ID dargestellt durch die $ ctx enthalten: commodityId (es den richtigen Wert enthält, weil ich LOGGE d es). Dann setze ich den Header mit dem Namen der Operation, die ausgeführt werden muss ("urn: GetCommodityDetails"). Finnaly ich den Anruf zu dem agrimarketprice_Endpoint durchführen, die die Details der vorherigen DSS-Dienst enthält, ist dies der Inhalt:

<?xml version="1.0" encoding="UTF-8"?> 
<endpoint name="agrimarketprice_Endpoint" xmlns="http://ws.apache.org/ns/synapse"> 
    <address uri="http://localhost:8280/services/agrimarketprice-dss"/> 
</endpoint> 

Dieser Endpunkt korrekt ist, weil ich es für eine weitere Abfrage in einer anderen API verwendet (aber es haben eine andere Logik, weil ich in dieser anderen Abfrage die Parameter aus einem JSON-Dokument extrahiere).

Die provlem ist, dass, wenn ich meine API-Aufruf Ich bin zu erhalten die folgende Fehlermeldung in das Carbon-log (Ich denke, wenn es versuchen, den Anruf auszuführen, die meine Abfrage ausführen):

TID: [-1234] [] [2017-10-03 11:55:16,574] INFO {org.apache.synapse.mediators.builtin.LogMediator} - {org.apache.synapse.mediators.builtin.LogMediator} 
TID: [-1234] [] [2017-10-03 11:55:16,574] INFO {org.apache.synapse.mediators.builtin.LogMediator} - commodity_details = 'commodity_details START' {org.apache.synapse.mediators.builtin.LogMediator} 
TID: [-1234] [] [2017-10-03 11:55:16,575] INFO {org.apache.synapse.mediators.builtin.LogMediator} - COMMODITY ID = 1 {org.apache.synapse.mediators.builtin.LogMediator} 
TID: [-1234] [] [2017-10-03 11:55:16,597] INFO {org.apache.synapse.core.axis2.TimeoutHandler} - This engine will expire all callbacks after GLOBAL_TIMEOUT: 120 seconds, irrespective of the timeout action, after the specified or optional timeout {org.apache.synapse.core.axis2.TimeoutHandler} 
TID: [-1234] [] [2017-10-03 11:55:16,637] ERROR {org.apache.axis2.engine.AxisEngine} - The endpoint reference (EPR) for the Operation not found is /services/agrimarketprice-dss/1 and the WSA Action = null. If this EPR was previously reachable, please contact the server administrator. {org.apache.axis2.engine.AxisEngine} 
org.apache.axis2.AxisFault: The endpoint reference (EPR) for the Operation not found is /services/agrimarketprice-dss/1 and the WSA Action = null. If this EPR was previously reachable, please contact the server administrator. 
     at org.apache.axis2.engine.DispatchPhase.checkPostConditions(DispatchPhase.java:102) 
     at org.apache.axis2.engine.Phase.invoke(Phase.java:329) 
     at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:261) 
     at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:167) 
     at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:326) 
     at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:158) 
     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) 
TID: [-1234] [] [2017-10-03 11:55:16,642] ERROR {org.apache.synapse.transport.passthru.ServerWorker} - Error processing GET request for : /services/agrimarketprice-dss/1 {org.apache.synapse.transport.passthru.ServerWorker} 
org.apache.axis2.AxisFault: The endpoint reference (EPR) for the Operation not found is /services/agrimarketprice-dss/1 and the WSA Action = null. If this EPR was previously reachable, please contact the server administrator. 
     at org.apache.axis2.engine.DispatchPhase.checkPostConditions(DispatchPhase.java:102) 
     at org.apache.axis2.engine.Phase.invoke(Phase.java:329) 
     at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:261) 
     at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:167) 
     at org.apache.synapse.transport.passthru.ServerWorker.processNonEntityEnclosingRESTHandler(ServerWorker.java:326) 
     at org.apache.synapse.transport.passthru.ServerWorker.run(ServerWorker.java:158) 
     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) 
TID: [-1] [] [2017-10-03 11:58:16,778] INFO {org.apache.synapse.transport.passthru.SourceHandler} - Writer null when calling informWriterError {org.apache.synapse.transport.passthru.SourceHandler} 
TID: [-1] [] [2017-10-03 11:58:16,780] WARN {org.apache.synapse.transport.passthru.SourceHandler} - Connection time out after request is read: http-incoming-6 Socket Timeout : 180000 Remote Address : /168.202.253.227:62418 {org.apache.synapse.transport.passthru.SourceHandler} 

Es scheint mir, dass dieser Fehler sollte auf diese Log-Informationen in Beziehung gesetzt werden:

The endpoint reference (EPR) for the Operation not found is /services/agrimarketprice-dss/1 and the WSA Action = null 

es scheint, dass es tryng die übergebene id (1), um die agrimarketprice-dss (das ist der Servicename) ignorning den Betrieb anhängen (das ist GetCommodityDetails und dass ich in der Kopfzeile angegeben).

Was ist also falsch? Was vermisse ich? Wie kann ich versuchen, diesen Fehler zu beheben?

EDIT-1: Ich habe versucht, einen anderen Weg: die API abrufen nicht die aus dem URL-Pfad commodity_id sondern aus einem JSON-Dokument wie dies in der Anfrage:

{ 
"commodity_id": 1 
} 

So ändert die API auf diese Weise funktioniert es gut, wird die Abfrage korrekt ausgeführt (aber ich brauche die commodity_id aus der URL abrufen und als Abfrageparameter verwenden (so könnte es nur eine Abhilfe sein):

<?xml version="1.0" encoding="UTF-8"?> 
<api context="/commodity_details" name="commodity_details" xmlns="http://ws.apache.org/ns/synapse"> 
    <resource methods="POST" protocol="http" uri-template="/"> 
     <inSequence> 
      <log level="full"/> 
      <log level="custom"> 
       <property expression="json-eval($.commodity_id)" name="Commodity ID"/> 
      </log> 
      <property expression="json-eval($.commodity_id)" name="CommodityId" scope="default" type="STRING"/> 
      <property name="messageType" scope="axis2" type="STRING" value="application/xml"/> 
      <payloadFactory media-type="xml"> 
       <format> 
        <ds:GetCommodityDetails xmlns:ds="http://ws.wso2.org/dataservice"> 
         <ds:commodity_details_id>$1</ds:commodity_details_id> 
        </ds:GetCommodityDetails> 
       </format> 
       <args> 
        <arg evaluator="json" expression="$.commodity_id"/> 
       </args> 
      </payloadFactory> 
      <header name="Action" scope="default" value="urn:GetCommodityDetails"/> 
      <call> 
       <endpoint key="agrimarketprice_Endpoint"/> 
      </call> 

      <send/> 
     </inSequence> 
     <outSequence> 
      <send/> 
     </outSequence> 
     <faultSequence/> 
    </resource> 
</api> 

Auf diese Weise wird der DSS-Dienst korrekt aufgerufen, die Abfrage durchgeführt und die API die erwartete Ausgabe an den Client zurücksenden.

Aber warum die ID aus dem JSON-Dokument in der POST-Anfrage abrufen funktioniert es gut, aber es funktioniert nicht abzurufen von der URL?

+0

Aktion entfernen.

simar

Antwort

0

Legen Sie den soapAction-Header wie folgt vor dem Anrufvermittler fest. Sie können überprüfen, ob der SOAPAction-Header in der Anforderung für Datendienst festgelegt wurde, indem Sie die Drahtloge

<property name="SOAPAction" scope="transport" value="urn:GetCommodityDetails"/> 
Verwandte Themen