开发者问题收集

如何在 WSO2 ESB 中的脚本中介中调用序列中介

2019-03-25
1329

我将在脚本中介下调用多个 WSO2 ESB 序列中介。这将按照 XML 标记格式循环。它将根据序列名称循环。我需要根据此 xml 标记值调用序列。

<message>
  <postCallSequences>
         <order>1</order>
         <sequencename>gov:/repository/sequences/AB_SQ.xml</sequencename>
      </postCallSequences>
      <postCallSequences>
         <order>2</order>
         <sequencename>gov:/repository/sequences/XY_SQ.xml</sequencename>
   </postCallSequences>
</message>

我有 XML 循环,如以下脚本中介。

var xmlDoc = new XML("XML_STRING_HERE");

for each (var p in xmlDoc..*::postCallSequences){
 var sequencename = p.sequencename.toString();
 var seq = mc.getSequence(sequencename);
 seq.mediate(mc);
 //seq.get(0).mediate(mc);
}

但它没有完全运行,它显示以下错误消息。

[2019-03-25 14:39:31,960] [EI-Core] ERROR - SequenceMediator Error while building message. null
java.lang.ClassCastException
[2019-03-25 14:39:31,960] [EI-Core] ERROR - CommonScriptMessageContext Error while building message. null
java.lang.ClassCastException
[2019-03-25 14:39:31,973] [EI-Core] ERROR - ScriptMediator The script engine returned an error executing the inlined js script function mediate
com.sun.phobos.script.util.ExtendedScriptException: org.mozilla.javascript.WrappedException: Wrapped org.apache.synapse.SynapseException: Error while building message. null (<Unknown Source>#21) in <Unknown Source> at line number 21
    at com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
    at javax.script.CompiledScript.eval(CompiledScript.java:92)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:394)
    at org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:289)
    at org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:257)
    at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108)

我也参考了以下链接。问题仍然存在。 link

2个回答

我们无法在脚本中调用序列中介的中介方法,因为在脚本中介中,使用的消息上下文对象是 CommonScriptMessageContext。我们可以使用此对象访问序列中介。但当序列中介执行时,有一个地方将消息上下文对象转换为 Axis2MessageContext [ 1 ]。 CommonScriptMessageContext 无法转换为 Axis2MessageContext,这将导致类转换异常。

作为您的要求的替代方案,我们可以使用 foreach 中介来代替脚本中介 [2] 。以下是可以实现与上述相同效果的示例配置。

     <foreach expression="//postCallSequences">
        <sequence>
           <property name="seq" expression="//sequencename"/>
           <sequence key="{$ctx:seq}"/>
        </sequence>
     </foreach>
Thishani Lucas
2019-04-02

由于脚本中介使用不同类型的 MessageContext 对象(javascript 的 CommonScriptMessageContext 和 Nashorn 的 NashornJavaScriptMessageContext),我们无法直接将相同的 messageContext 对象传递给需要 org.apache.synapse.MessageContext 实例的序列中介。 为了避免此 ClassCastException 问题,我们可以在脚本中介中创建一个预期类型的​​新 messageContext,并将其传递给序列中介,如下所示。

var seq = mc.getSequence(sequencename);
var newMC = mc.getEnvironment().createMessageContext();
newMC.setEnvelope(mc.getEnvelope());
seq.mediate(newMC);
prabushi samarakoon
2019-04-03