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

Javascript 如何在WSO2 ESB中的脚本中介器内调用序列中介器,javascript,wso2,wso2esb,wso2ei,Javascript,Wso2,Wso2esb,Wso2ei,我将在脚本中介器下使用调用多个WSO2 ESB序列中介器。这将按照XML标记格式进行循环。基于sequencename,它将循环。我需要根据这个xml标记值调用序列 <message> <postCallSequences> <order>1</order> <sequencename>gov:/repository/sequences/AB_SQ.xml</sequencename>

我将在脚本中介器下使用调用多个WSO2 ESB序列中介器。这将按照XML标记格式进行循环。基于sequencename,它将循环。我需要根据这个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>
但它没有完全运行,它显示以下错误消息

[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)
[2019-03-25 14:39:31960][EI Core]错误-SequenceMediator在生成消息时出错。无效的
java.lang.ClassCastException
[2019-03-25 14:39:31960][EI Core]错误-生成消息时出现CommonScriptMessageContext错误。无效的
java.lang.ClassCastException
[2019-03-25 14:39:31973][EI Core]错误-脚本中介脚本引擎在执行内联js脚本函数mediate时返回错误
com.sun.phobos.script.util.ExtendedScriptException:org.mozilla.javascript.WrappedException:Wrapped org.apache.synapse.SynapseException:生成消息时出错。第21行中的null(#21)
位于com.sun.phobos.script.javascript.RhinoCompiledScript.eval(RhinoCompiledScript.java:68)
位于javax.script.CompiledScript.eval(CompiledScript.java:92)
位于org.apache.synapse.mediators.bsf.ScriptMediator.mediateForInlineScript(ScriptMediator.java:394)
位于org.apache.synapse.mediators.bsf.ScriptMediator.invokeScript(ScriptMediator.java:289)
位于org.apache.synapse.mediators.bsf.ScriptMediator.mediate(ScriptMediator.java:257)
位于org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:108)

我也参考了下面的链接。这个问题仍然存在

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

作为您需求的替代方案,我们可以使用foreach中介来代替脚本中介。下面是一个示例配置,可以实现与上面相同的功能

     <foreach expression="//postCallSequences">
        <sequence>
           <property name="seq" expression="//sequencename"/>
           <sequence key="{$ctx:seq}"/>
        </sequence>
     </foreach>

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

作为您需求的替代方案,我们可以使用foreach中介来代替脚本中介。下面是一个示例配置,可以实现与上面相同的功能

     <foreach expression="//postCallSequences">
        <sequence>
           <property name="seq" expression="//sequencename"/>
           <sequence key="{$ctx:seq}"/>
        </sequence>
     </foreach>

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

var seq=mc.getSequence(sequencename);
var newMC=mc.getEnvironment().createMessageContext();
newMC.setEnvelope(mc.getEnvelope());

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

var seq=mc.getSequence(sequencename);
var newMC=mc.getEnvironment().createMessageContext();
newMC.setEnvelope(mc.getEnvelope());
顺序:调解(新MC)