簡體   English   中英

問題:在404上使用阻止選項致電調解員

[英]Issue on : Call Mediator with blocking option on 404

我在呼叫中介器上遇到“ blocking = true”問題。 當被調用的后端端點返回404(因為在REST get上找不到任何數據)時,將返回一個堆棧跟蹤,並且此堆棧跟蹤失敗:

[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)

即使,我嘗試傳遞該參數:因為在HttpSender中從String到Set(!!)的強制轉換失敗:

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

這是我的呼叫中介程序,當端點響應404時會拋出異常:

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

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

那么, 如何在阻塞調用中正確處理404響應代碼?

謝謝

您可以使用故障序列來處理wso2 ESB中提到的錯誤。 備用序列也與其他序列相同。如果在調解過程或轉發消息期間發生錯誤,則會執行故障序列。 在您的方案中,您正在ESB中使用REST api,並且可以在API配置中指定faultsequenc。 如果在調用該API時發生了一些錯誤,則觸發該錯誤的消息將委派給指定的故障序列。 首先,您需要創建一個故障序列,然后可以在API配置中指定該故障序列。 請參閱以下樣本配置。

FaultSequence

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

API配置

<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>

您可以參考文檔[1],[2]以獲取有關Wso2 ESB中的錯誤處理的更多信息。 [1] -https://docs.wso2.com/display/ESB490/錯誤+處理 [2] -https://docs.wso2.com/display/ESB490/Sample+4%3A+Specifying+a+Fault +序列與+ + A +普通+調解+序列

謝謝。

可以通過簡單的調解員來完成

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;
    }

}

致電者:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM