如何在WSO2 ESB中的脚本调解器内调用Sequence mediator

问题描述 投票:1回答:2

我将在脚本调解器下使用多个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>

我有像上面的脚本调解器一样循环上面的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)

我也提到了以下链接。还有问题。 qazxsw poi

javascript wso2 wso2esb wso2ei
2个回答
2
投票

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

作为您的要求的替代方案,我们可以使用foreach mediator1代替脚本调解器。以下是可以实现与上述相同的示例配置。

[2]

1
投票

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

     <foreach expression="//postCallSequences">
        <sequence>
           <property name="seq" expression="//sequencename"/>
           <sequence key="{$ctx:seq}"/>
        </sequence>
     </foreach>
Please note that, since a var seq = mc.getSequence(sequencename); var newMC = mc.getEnvironment().createMessageContext(); newMC.setEnvelope(mc.getEnvelope()); seq.mediate(newMC); is created, we will have to set the expected attributes to the newly created message context. We can refer the methods exposed in new messageContext or CommonScriptMessageContext to retrieve the values from the previous messageContext.
© www.soinside.com 2019 - 2024. All rights reserved.