我将在脚本中介器下使用多个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
答案 0 :(得分:2)
我们无法在脚本内调用序列中介器的中介方法,因为在脚本中介器中,所使用的消息上下文对象是CommonScriptMessageContext。我们可以使用此对象访问序列介体。但是,当序列中介程序执行时,会有一个消息上下文对象被强制转换为Axis2MessageContext [1]的地方。无法将CommonScriptMessageContext强制转换为Axis2MessageContext,这将导致类强制转换异常。
作为您要求的替代方法,我们可以使用foreach中介器[2]代替脚本中介器。以下是可以实现与上述相同的示例配置。
<foreach expression="//postCallSequences">
<sequence>
<property name="seq" expression="//sequencename"/>
<sequence key="{$ctx:seq}"/>
</sequence>
</foreach>
答案 1 :(得分:1)
由于脚本中介器使用不同类型的MessageContext对象(JavaScript使用CommonCommonMessageContext,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);