【问题标题】:Issue on : Call Mediator with blocking option on 404问题:在 404 上使用阻止选项呼叫调解员
【发布时间】:2016-08-10 01:44:25
【问题描述】:

我在呼叫调解员上遇到了“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 wso2esb axis2


    【解决方案1】:

    您可以使用故障序列来处理 wso2 ESB 中提到的错误。故障序列也与其他序列相同。如果在调解过程中出现错误或 转发消息,faultsequence 将执行。在您的场景中,您在 ESB 中使用 REST api,您可以在 API 配置中指定故障序列。 如果在调用该 API 时发生错误,则触发错误的消息将委托给指定的故障序列。首先,您需要创建一个故障序列,然后您可以指定 API 配置中的故障序列。请参阅以下示例配置。

    故障序列

    <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/Error+Handling [2] - https://docs.wso2.com/display/ESB490/Sample+4%3A+Specifying+a+Fault+Sequence+with+a+Regular+Mediation+Sequence

    谢谢。

    【讨论】:

      【解决方案2】:

      可以通过简单的中介来完成

      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>
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-23
        • 2014-05-12
        • 1970-01-01
        相关资源
        最近更新 更多