[英]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.