Можно ли использовать итерацию с call и agregate в той же последовательности? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть сценарий, в котором мне нужно перебрать xml и несколько раз вызвать конечную точку. После этого мне нужно агрегировать результаты и использовать собственный медиатор. Проблема в том, что все это должно быть выполнено в единой последовательности, выполняемой запланированной задачей. Есть ли способ сделать это без создания какого-либо прокси на стороне?

Вот мой пример кода:

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="s_queue_kernel_dev" xmlns="http://ws.apache.org/ns/synapse">
    <kernel.prepare/>
    <iterate continueParent="true"
        expression="//*[local-name()='request']" id="it1"
        sequential="true" xmlns:ns="http://org.apache.synapse/xsd">
        <target>
            <sequence>
                <payloadFactory media-type="xml">
                    <format>
                        <ser:getEntity xmlns:ser="http://services">
                            <ser:entityID>$1</ser:entityID>
                        </ser:getEntity>
                    </format>
                    <args>
                        <arg evaluator="xml"
                            expression="./*[local-name()='entityId']" literal="false"/>
                    </args>
                </payloadFactory>
                <kernel.log>
                    <operation>REQUEST</operation>
                    <description>{$body}</description>
                </kernel.log>
                <call blocking="false">
                    <endpoint key="gov:atena/endpoints/egida/entities.xml"/>
                </call>
            </sequence>
        </target>
    </iterate>
    <aggregate id="it1">
        <completeCondition>
            <messageCount max="-1" min="-1"/>
        </completeCondition>
        <onComplete expression="//*[local-name()='getEntityReturn']" xmlns:ns="http://org.apache.synapse/xsd">
            <kernel.log>
                <operation>RESPONSE</operation>
                <description>{$body}</description>
            </kernel.log>
        </onComplete>
    </aggregate>
    <kernel.log>
        <operation>SUCCESS</operation>
        <description>{$body}</description>
    </kernel.log>
    <kernel.success/>
</sequence>

1 Ответ

3 голосов
/ 18 февраля 2020

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

<sequence>
        <property name="messageType" value="text/xml" scope="axis2"/>
        <iterate continueParent="true" id="check" expression="//Samples/Sample">
            <target>
                <sequence>
                    <call>
                        <endpoint>
                            <http method="GET" uri-template="http://www.mocky.io/v2/5e2aaab832000066001c6d06"/>
                        </endpoint>
                    </call>
                    <property name="info" scope="default">
                        <ns:Information xmlns:ns="www.asankatechtalks.com"/>
                    </property>
                </sequence>
            </target>
        </iterate>
        <aggregate id="check">
            <completeCondition>
                <messageCount max="-1" min="-1"/>
            </completeCondition>
            <onComplete expression="$body/*[1]" enclosingElementProperty="info">
                <respond/>
            </onComplete>
        </aggregate>
    </sequence>
...