2017-02-07 17 views
0

В настоящее время я пытаюсь вычислить полезную нагрузку в агрегатном элементе из шаблона последовательности. Моя проблема заключается в том, что полезная нагрузка, возвращаемая этой последовательностью, является той, которая генерируется агрегатом, а не сборкой с фабрикой полезных данных. Вот примерОбмен полезной нагрузкой WSO2 в совокупности

<clone id="TEST" sequential="true"> 
    <target> 
    <sequence> 
     <call-template key="do-soemthing"/> 
    </sequence> 
    </target> 
    <target> 
    <sequence> 
     <call-template key="do-something-else"/> 
    </sequence> 
    </target> 
</clone> 
<aggregate id="TEST"> 
<completeCondition> 
    <messageCount max="-1" min="-1"/> 
</completeCondition> 
<onComplete expression="//status"> 
    <filter xpath="count(//status[text() = 'NOK']) = 0"> 
     <then> 
     <payloadFactory media-type="xml"> 
      <format> 
      <myPayload> 
       <status>OK</status> 
       <action>foo</action> 
      </myPayload> 
      </format> 
      <args/> 
     </payloadFactory> 
     </then> 
     <else> 
     <payloadFactory media-type="xml"> 
      <format> 
      <myPayload> 
       <status>NOK</status> 
       <action>bar</action> 
      </myPayload> 
      </format> 
      <args/> 
     </payloadFactory> 
     </else> 
    </filter> 
    </onComplete> 
</aggregate> 

Что бы ожидать при вызове этой последовательности, чтобы получить обратно элемент, но вместо этого я получаю (агрегировать). Как я могу это решить?

Благодаря

ответ

2

Если вы хотите медиаторы после того, как клон будет выполнена, вы должны установить атрибут continueParent = «истинный» на клоне медиатора.

Но этого недостаточно в вашем случае, потому что сообщения, сгенерированные в целях клонирования, теряются после посредника клонирования: вы должны переместить ваш агрегированный медиатор в последовательности и вызвать эту последовательность внутри каждой цели клона.

Сюда приходят образец, состоящий из прокси-сервис (который вы можете просто выполнить с помощью интернет-браузера: http://localhost:8280/services/TestSOF) и последовательности, используемой для агрегирования имитировали ответов

<?xml version="1.0" encoding="UTF-8"?> 
<proxy xmlns="http://ws.apache.org/ns/synapse" 
     name="TestSOF" 
     transports="http" 
     startOnLoad="true" 
     trace="disable"> 
    <description/> 
    <target> 
     <inSequence> 
     <property name="messageType" value="application/xml" scope="axis2"/> 
     <clone continueParent="true"> 
      <target> 
       <sequence> 
        <payloadFactory media-type="xml"> 
        <format> 
         <resp1 xmlns=""> 
          <status>OK</status> 
         </resp1> 
        </format> 
        <args/> 
        </payloadFactory> 
        <header name="To" action="remove"/> 
        <property name="RESPONSE" value="true"/> 
        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
        <sequence key="TestSOFAgg"/> 
       </sequence> 
      </target> 
      <target> 
       <sequence> 
        <payloadFactory media-type="xml"> 
        <format> 
         <resp2 xmlns=""> 
          <status>OK</status> 
         </resp2> 
        </format> 
        <args/> 
        </payloadFactory> 
        <header name="To" action="remove"/> 
        <property name="RESPONSE" value="true"/> 
        <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/> 
        <sequence key="TestSOFAgg"/> 
       </sequence> 
      </target> 
     </clone> 
     <log level="full"> 
      <property name="DEBUG" value="after clone"/> 
     </log> 
     </inSequence> 
    </target> 
</proxy> 
<sequence xmlns="http://ws.apache.org/ns/synapse" name="TestSOFAgg"> 
    <aggregate> 
    <completeCondition> 
     <messageCount max="-1" min="-1"/> 
    </completeCondition> 
    <onComplete expression="//status"> 
     <log level="full"><property name="DEBUG" value="inside onComplete"/></log> 
     <filter xpath="count(//status[text() = 'NOK']) = 0"> 
      <then> 
      <payloadFactory media-type="xml"> 
       <format> 
       <myPayload> 
        <status>OK</status> 
        <action>foo</action> 
       </myPayload> 
       </format> 
       <args/> 
      </payloadFactory> 
      </then> 
      <else> 
      <payloadFactory media-type="xml"> 
       <format> 
       <myPayload> 
        <status>NOK</status> 
        <action>bar</action> 
       </myPayload> 
       </format> 
       <args/> 
      </payloadFactory> 
      </else> 
     </filter> 
     <respond/> 
     </onComplete> 
    </aggregate> 
</sequence> 

См сообщение вошедшего «после клонирования»: мыло Тело пустое (если вы использовали Браузер для его проверки, или у вас будет сообщение о мыле, которое вы отправили с помощью SoapUI, например, ваш агрегат не может работать здесь

См сообщения протоколируется «внутри OnComplete»: вы можете увидеть все элементы состояния внутри тела мыла

Modify один из ложных ответов с чем-то еще, что КИ и повторите попытку: изменение ответа, он работает ;-)

+0

Спасибо за ваш ответ, если я установлю continueParent = "true", я не смогу получить результат последовательности клонов в конце клона, я просто оставлю полезную нагрузку перед другим вызовом. Я попытаюсь объединить внутри каждого элемента клона, но это не звучит ни логично, ни естественно для меня, насколько я всегда понимал, что агрегация должна выполняться только один раз, когда все последовательности выполняются. – Nicolas

+0

неправильный агрегирующий агент должен быть вызван столько раз, сколько есть reponses, это причина messageCount в completeCondition: вы можете установить -1 с помощью посредника клона, потому что ESB знает, что были установлены 2 цели. Когда completeCondition истинна («последнее» время, которое вызвал посредник aggreage), выполняется «onComplete» часть –

+0

Я выполнил несколько тестов, и я никогда не получаю полезную нагрузку из совокупности, я просто извлекаю оригинальная полезная нагрузка. Может быть, причина в том, что я не использую это в прокси, но в регулярной последовательности? – Nicolas

 Смежные вопросы

  • Нет связанных вопросов^_^