2016-04-18 1 views
2

コールメディエータで「blocking = true」という問題が発生しました。 と呼ばれるバックエンドのエンドポイントは、(データがREST得る上で見つけることができなかったので)404は、スタックトレースが返され、シーケンスは、このスタックトレースで失敗戻ってきたとき:、私はそのパラメータを渡すためにしようとした場合でも 問題: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) 

:HttpSenderで それは文字列からセットにキャストに失敗したので、(!!):ここで

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応答コードを適切に処理するにはどうすればよいですか?

おかげ

答えて

0

あなたはWSO2 ESBに記載されたエラーを処理するためにfaultsequenceを使用することができます。 falutシーケンスも他のシーケンスと同じです。メディエーション・プロセス中に何らかのエラーが発生した場合、または メッセージを転送すると、faultsequenceが実行されます。ご使用のシナリオでは、ESBでREST APIを使用しており、API構成でfaultsequencを指定できます。 そのAPIの呼び出し中に何らかのエラーが発生した場合、エラーをトリガーしたメッセージは指定されたフォルトシーケンスに委任されます。まず、faultsequnceを作成してから、API設定で faultsequnceを指定する必要があります。以下のサンプル構成を参照してください。

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> 

あなたはWSO2 ESBエラー処理に関する詳細な情報を取得するために、文書[1]、[2]を参照することができます。 [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

ありがとうございます。

0

それは簡単な仲介者によって

によって呼び出さ
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> 
関連する問題