Как вызвать посредник последовательности внутри посредника сценариев в WSO2 ESB - PullRequest
1 голос
/ 25 марта 2019

Я собираюсь вызвать несколько посредников ESB Sequence WSO2, используя посредник сценариев. Это зациклится, следуя формату тега 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)

Я также ссылался на следующую ссылку. Все еще проблема там. ссылка

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Мы не можем вызвать метод-посредник посредника последовательности внутри сценария, поскольку в посреднике сценария используется объект контекста сообщения CommonScriptMessageContext.Мы можем получить доступ к посреднику последовательности, используя этот объект.Но когда выполняется посредник последовательности, есть место, где объект контекста сообщения приводится к Axis2MessageContext [ 1 ].CommonScriptMessageContext не может быть приведен к Axis2MessageContext, что приведет к исключению приведения класса.

В качестве альтернативы вашему требованию вместо посредника сценария мы можем использовать foreach mediator [2] .Ниже приведен пример конфигурации, которая может достичь того же, что и выше.

     <foreach expression="//postCallSequences">
        <sequence>
           <property name="seq" expression="//sequencename"/>
           <sequence key="{$ctx:seq}"/>
        </sequence>
     </foreach>
1 голос
/ 03 апреля 2019

Поскольку посредник сценария использует различные типы объектов 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());
seq.mediate(newMC);
Обратите внимание, что, поскольку создается new messageContext , нам нужно будет установить ожидаемые атрибуты для вновь созданного контекста сообщения.Мы можем ссылаться на методы, представленные в CommonScriptMessageContext или NashornJavaScriptMessageContext , чтобы извлечь значения из предыдущего messageContext.
...