2016-04-18 8 views
2

Ich habe ein Problem mit "blocking = true" auf einem Anruf Mediator. Wenn der gerufene Backend Endpunkt zurückgegeben 404 (weil keine Daten über REST erhalten gefunden werden können), ein stacktrace zurückgeführt wird und die Sequenz nicht mit diesem Stack-Trace:Problem auf: Anrufmediator mit Blockierungsoption auf 404

[2016-04-18 12:49:20,303] INFO - HTTPSender Unable to sendViaGet to url[http://api.vidal.fr:80/rest/imd/package/412849-1862-2/lppr?app_id=0c117950&app_key=f6657d21b96e5e86ff1758be84618459] 
org.apache.axis2.AxisFault: Transport error: 404 Error: Introuvable 
    at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:331) 
    at org.apache.axis2.transport.http.HTTPSender.sendViaGet(HTTPSender.java:105) 
    at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:63) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:451) 
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:278) 
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442) 
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:430) 
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225) 
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149) 
    at org.apache.synapse.message.senders.blocking.BlockingMsgSender.sendReceive(BlockingMsgSender.java:254) 
    at org.apache.synapse.message.senders.blocking.BlockingMsgSender.send(BlockingMsgSender.java:175) 
    at org.apache.synapse.mediators.builtin.CallMediator.handleBlockingCall(CallMediator.java:113) 
    at org.apache.synapse.mediators.builtin.CallMediator.mediate(CallMediator.java:85) 
    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.mediators.base.SequenceMediator.mediate(SequenceMediator.java:214) 
    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.mediators.eip.Target.mediate(Target.java:106) 
    at org.apache.synapse.mediators.eip.splitter.IterateMediator.mediate(IterateMediator.java:163) 
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:81) 
    at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:261) 
    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:247) 
    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) 

Auch wenn ich versuche, diesen Parameter zu übergeben : da schlägt es aus einem String auf einem guss ein Set (!!) in HttpSender:

Set<Integer>nonErrorCodes = (Set<Integer>) msgContext.getProperty(HTTPConstants.NON_ERROR_HTTP_STATUS_CODES); 

Hier mein Anruf Mediator ist die Ausnahme, wenn der Endpunkt reagieren, um eine 404 wirft:

<property value="404" name="non.error.http.status.codes" scope="axis2" type="STRING" /> 

<call blocking="true"> 
    <endpoint key="xxxx" /> 
</call> 

So, Wie können wir 404 Antwort Code auf einem blockierenden Anruf richtig behandeln?

Dank

Antwort

0

können Sie einen faultsequence verwenden, um die erwähnten Fehler in der WSO2 ESB zu behandeln. Die Falut-Sequenz ist auch genauso wie die anderen Sequenzen. Wenn während des Mediationsprozesses ein Fehler auftritt oder Die Nachricht weiterleitet, wird faultsequence ausgeführt. In Ihrem Szenario verwenden Sie REST-API in ESB und Sie können eine Fehlerreihenfolge in der API-Konfiguration angeben. Wenn beim Aufruf dieser API ein Fehler aufgetreten ist, wird die Nachricht, die den Fehler ausgelöst hat, an die angegebene Fehlersequenz delegiert. Zuerst müssen Sie eine Fehlerquelle erstellen und dann können Sie in Ihrer API-Konfiguration faultsequence angeben. Siehe folgende Beispielkonfigurationen.

FaultSequence

<sequence name="sampleFaultSequence"> 
    <makefault version="pox"> 
     <reason expression="get-property('ERROR_MESSAGE')"/> 
    </makefault> 
    <send/> 
</sequence> 

API Konfiguration

<api xmlns="http://ws.apache.org/ns/synapse" name="testapi" context="/abcd"> 
    <resource methods="POST GET" uri-template="/*" faultSequence="sampleFaultSequence"> 
     <inSequence> 
     <call blocking="true"> 
      <endpoint key="conf:/ep1"/> 
     </call> 
     <respond/> 
     </inSequence> 
    </resource> 
</api> 

Sie Dokument verweisen [1], [2], um weitere Informationen über den Fehler immer in der ESB WSO2 Handhabung. [1] - https://docs.wso2.com/display/ESB490/Error+Handling [2] - https://docs.wso2.com/display/ESB490/Sample+4%3A+Specifying+a+Fault+Sequence+with+a+Regular+Mediation+Sequence

Dank.

0

Es kann durch einfache Vermittler

import java.util.HashSet; 
import java.util.Set; 

import org.apache.synapse.MessageContext; 
import org.apache.synapse.mediators.AbstractMediator; 

public class ConfigureErrorResponseCodes extends AbstractMediator { 

    private static final String ERROR_HTTP_STATUS_CODES  = "error.http.status.codes"; 
    private static final String NON_ERROR_HTTP_STATUS_CODES = "non.error.http.status.codes"; 

    // error.http.status.codes 
    private String errorHttpStatusCodes; 

    // non.error.http.status.codes 
    private String nonErrorHttpStatusCodes; 

    @Override 
    public boolean mediate(MessageContext context) { 
     org.apache.axis2.context.MessageContext axisInMsgCtx = ((Axis2MessageContext)context).getAxis2MessageContext(); 
     axisInMsgCtx.setProperty(ERROR_HTTP_STATUS_CODES, errorHttpStatusCodes); 
     axisInMsgCtx.setProperty(NON_ERROR_HTTP_STATUS_CODES, getCodes(nonErrorHttpStatusCodes)); 
     return true; 
    } 

    private Set<Integer> getCodes(String codes) { 
     Set<Integer> set = new HashSet<Integer>(); 

     if (codes != null) { 
      String [] codes$ = codes.split(","); 
      for (String code : codes$) { 
       set.add(Integer.parseInt(code)); 
      } 
     } 

     return set; 
    } 

    public String getErrorHttpStatusCodes() { 
     return errorHttpStatusCodes; 
    } 

    public void setErrorHttpStatusCodes(String errorHttpStatusCodes) { 
     this.errorHttpStatusCodes = errorHttpStatusCodes; 
    } 

    public String getNonErrorHttpStatusCodes() { 
     return nonErrorHttpStatusCodes; 
    } 

    public void setNonErrorHttpStatusCodes(String nonErrorHttpStatusCodes) { 
     this.nonErrorHttpStatusCodes = nonErrorHttpStatusCodes; 
    } 

} 

genannt erfolgen durch:

<class name="ConfigureErrorResponseCodes"> 
    <property name="nonErrorHttpStatusCodes" value="404"/> 
</class>