Задача
Вызвать один sequence из другого так, чтобы ошибка внутри вложенного sequence (например, сетевая ошибка при выполнении callout-медиатора) не приводила к ошибке наружного.
Решение
Т.к. средствами sequence-медиатора такое поведение нереализуемо, пришлось вызывать sequence из groovy-кода. Данная операция требует некоторых манипуляций с axis-контекстом, передаваемым вызываемой sqeucence. Немного длинно, но работает:
<script language="groovy"><![CDATA[ import org.apache.commons.logging.LogFactory; import org.apache.synapse.core.axis2.Axis2MessageContext; try { /* create Axis2MessageContext, as ScriptMessageContext often can't be used to call this sequence - for example callout mediator in it will fail */ def mc2 = new Axis2MessageContext(new org.apache.axis2.context.MessageContext(),mc.getConfiguration(), mc.getEnvironment()); // copy existing envelope def newEnvelope = org.apache.axiom.om.util.CopyUtils.copy(mc.getEnvelope()); mc2.setEnvelope(newEnvelope); // propagate some properties to child context mc2.setProperty("prop1", mc.getProperty("prop1")); // force child sequence to use proxy-service logger mc2.setServiceLog(LogFactory.getLog("SERVICE_LOGGER.ProxyServiceName")); // execute child sequence mc.getSequence("ChildSequenceName").mediate(mc2); // restore envelope mc.setEnvelope(mc2.getEnvelope()); // restore some properties mc.setProperty("prop2", mc2.getProperty("prop2")); } catch(Exception ex) { LogFactory.getLog("SERVICE_LOGGER.ProxyServiceName").warn("Child sequence failed, continuing",ex); } ]]></script>
Комментариев нет:
Отправить комментарий