【问题标题】:How to call Sequence mediator inside the script mediator in WSO2 ESB如何在 WSO2 ESB 中的脚本中介内调用序列中介
【发布时间】:2019-03-25 09:17:54
【问题描述】:

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

<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

【问题讨论】:

    标签: javascript wso2 wso2esb wso2ei


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      var seq = mc.getSequence(sequencename);
      var newMC = mc.getEnvironment().createMessageContext();
      newMC.setEnvelope(mc.getEnvelope());
      seq.mediate(newMC);
      请注意,由于创建了new messageContext,我们必须将预期属性设置为新创建的消息上下文。我们可以参考CommonScriptMessageContextNashornJavaScriptMessageContext 中公开的方法来从之前的messageContext 中检索值。

      【讨论】:

        猜你喜欢
        • 2012-08-31
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多