Я разрабатываю 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