Параллельная обработка в WSO2 EI 6.2 - PullRequest
1 голос
/ 02 марта 2020

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

           seqA (faultSsqA)
         /
mainSeq  - seqB (faultSeqB)
         \ seqC (faultSeqC)

Если все последовательности успешно обрабатываются, все идет хорошо, и я могу обработать ответ, однако, если есть ошибка в одной из конечных последовательностей, соответствующая последовательность ошибок выполнена, но я не знаю, как вернуть поток выполнения обратно в основную последовательность. Что я хочу, так это то, что если в последовательности B возникает исключение, выполняется последовательность ошибок B, а затем поток выполнения возвращается к основной последовательности, а затем к последовательности C. Еще лучше было бы, если бы я мог выполнить все листовые последовательности в pararel и просто собрать все результаты в конце. Я знаю, что итеративный посредник делает это, но из того, что я понимаю, семантика - это не то, что я хочу. У кого-нибудь есть мысли по этому поводу?

РЕДАКТИРОВАТЬ: так что мне кажется, что я ищу посредника-клона, однако я все еще не могу заставить его работать так, как мне нужно. Поскольку я буду подключаться к различным платформам, форматы ответов различны. Кроме того, мне нужно обработать такие ситуации, как тайм-ауты, 500 кодов ответов и т. Д. c. Поэтому я не могу просто вызвать конечную точку для каждой цели - для каждой серверной платформы я создал последовательность, которая выполняет всю эту логику c, и заполнил некоторые свойства, чтобы я мог заполнить окончательный ответ ("платформа A = вверх ", et c). Я ожидаю, что все целевые последовательности будут обработаны в paralel

Это моя основная последовательность. Я использую медиатор клонирования и нацеливаю его на 2 разные последовательности, которые выполняют фактический вызов EP и обрабатывают ответ (сейчас я использую только 2, но в будущем их будет гораздо больше). Последовательности также обновляют некоторые переменные, чтобы отразить состояние базовых платформ («платформа A = вверх» и т. Д. c).

<sequence name="inSequence_healthCheck" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <clone id="healthCHeck">
        <target>
            <sequence>
                <sequence key="healthCheck_wacs"/>
            </sequence>
        </target>
        <target>
            <sequence>
                <sequence key="healthCheck_thesys"/>
            </sequence>
        </target>
    </clone>
    <loopback/>
</sequence>

Это одна из целевых последовательностей (она очень проста для сейчас, но в нем должно быть больше логи c). Обратите внимание, что я заполняю свойство wacsStatus в зависимости от ответа.

<sequence name="healthCheck_wacs" onError="faultSequence_healthCheck_wacs" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <call>
        <endpoint key="gov:ClientEquipments/endpoints/WACS/wacs_healthCheck.endpoint.xml"/>
    </call>
    <switch source="$axis2:HTTP_SC">
        <case regex="2\d\d|4\d\d">
            <property name="wacsStatus" scope="default" type="BOOLEAN" value="true"/>
        </case>
        <default>
            <property name="wacsStatus" scope="default" type="BOOLEAN" value="false"/>
        </default>
    </switch>
</sequence>

И это мой outSequence, который выполняет агрегацию:

<sequence name="outSequence_healthCheck" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <log>
        <property name="step" value="START outSequence_healthCheck"/>
        <property expression="$ctx:wacsStatus" name="wacsStatus"/>
        <property expression="$ctx:thesysStatus" name="thesysStatus"/>
        <property expression="$ctx:phStatus" name="phStatus"/>
        <property expression="$ctx:naStatus" name="naStatus"/>        
    </log>
  <property name="info" scope="default">
    <ns:Information xmlns:ns="http://wso2.com"/>
  </property>
    <aggregate id="healthCHeck">
        <completeCondition>
            <messageCount max="-1" min="2"/>
        </completeCondition>
        <onComplete enclosingElementProperty="info" expression="s11:Body/child::* | s12:Body/child::*" 
              xmlns:m0="http://services.samples" xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" 
              xmlns:s12="http://www.w3.org/2003/05/soap-envelope">
          <log level="full"/> 
        </onComplete>

    </aggregate>
          <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
            <payloadFactory media-type="json">
                <format>
            {
                "WACS" : "$1",
                "thesys" : "$2"
            }
                        </format>
                <args>
                    <arg evaluator="xml" expression="$ctx:wacsStatus"/>
                    <arg evaluator="xml" expression="$ctx:thesysStatus"/>
                </args>
            </payloadFactory>
            <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
            <property name="HTTP_SC" scope="axis2" type="STRING" value="200"/>
            <respond/>  
</sequence>

Я ожидаю, что агрегатор-посредник будет дождитесь выполнения всех целевых последовательностей, к тому времени все свойства будут правильно заполнены, и я смогу использовать payloadFactory для правильного форматирования ответа. Тем не менее, из журналов видно, что, хотя агрегат агрегирует все ответы от целевых последовательностей, свойства не заполняются должным образом, и поэтому ответ является неправильным.

Спасибо.

Pedro

1 Ответ

0 голосов
/ 03 марта 2020

Вы должны попробовать итеративную конструкцию медиатор / клон и агрегат (шаблон рассеяния-сбора). Итерация позволяет выполнять несколько последовательностей в параллельном режиме, в то время как агрегат будет собирать ответы. Вы можете использовать отдельные последовательности для обработки ошибок и возвращать либо ожидаемый ответ, либо какой-либо сбой. Затем вы можете проверить агрегированный результат на наличие ошибок.

Вот несколько примеров: Блог Yenlo Команда разработчиков WSO2

...