Каков наилучший способ итерации внутри WSO2 EI? - PullRequest
1 голос
/ 23 января 2020


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

   {
...
   "array": [
    {"cpf": "12345678911"},
    {"cnpj":"12345678912346"}
   ]
}

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

enter image description here

Код, который реализует это изображение, выглядит следующим образом:

 <iterate description="" expression="//jsonObject/array" id="myid">
                        <target>
                            <sequence>
                                <property expression="json-eval($.array.cpf)" name="tipoCPF" scope="default" type="STRING"/>
                                <filter description="" xpath="boolean(get-property('tipoCPF'))">
                                    <then>
                                        <property expression="json-eval($.array.cpf)" name="uri.var.cpf" scope="default" type="STRING"/>

                                        <call>
                                            <endpoint>
                                                <http method="get" uri-template="http://endpoint/service/{uri.var.cpf}"/>
                                            </endpoint>
                                        </call>
                                        <filter regex="200" source="get-property('axis2','HTTP_SC')">
                                            <then/>
                                            <else>
                                                <payloadFactory description="" media-type="json">
                                                    <format>{&#xd;
"code":"400",&#xd;
"error":"CPF inexistente"&#xd;
}</format>
                                                    <args/>
                                                </payloadFactory>
                                                <property name="HTTP_SC" scope="axis2" type="STRING" value="400"/>
                                                <respond/>
                                            </else>
                                        </filter>
                                    </then>
                                    <else>
                                        <property expression="json-eval($.array.cnpj)" name="tipoCNPJ" scope="default" type="STRING"/>
                                        <filter xpath="boolean(get-property('tipoCNPJ'))">
                                            <then>
                                                <property expression="json-eval($.array.cnpj)" name="uri.var.cnpj" scope="default" type="STRING"/>
                                                <header name="Authorization" scope="transport" value="Basic Y29yZS5jb25zdWx0aW5nOm8xNXRyZWI="/>
                                                <call>
                                                    <endpoint>
                                                        <http method="get" uri-template="http://endpoint/service/cnpj/{uri.var.cnpj}"/>
                                                    </endpoint>
                                                </call>
                                                <filter regex="200" source="get-property('axis2','HTTP_SC')">
                                                    <then/>
                                                    <else>
                                                        <payloadFactory media-type="json">
                                                            <format>{&#xd;
        "code":"400",&#xd;
        "error":"CNPJ inexistente"&#xd;
        }</format>
                                                            <args/>
                                                        </payloadFactory>
                                                        <property name="HTTP_SC" scope="axis2" type="STRING" value="400"/>
                                                        <respond/>
                                                    </else>
                                                </filter>
                                            </then>
                                            <else>
                                                <call>
                                                    <endpoint>
                                                        <http method="get" uri-template="http://endpoint/service/info"/>
                                                    </endpoint>
                                                </call>
                                            </else>
                                        </filter>
                                    </else>
                                </filter>
                            </sequence>
                        </target>
                    </iterate>

Этот итератор работает как часть внутри «последовательности». «Insequence» предназначен для того, чтобы позволять вставлять информацию о новых контрактах в базу данных.

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

Итак, какова правильная сыворотка для выполнения этих итераций внутри EI WSO2?

Ответы [ 2 ]

1 голос
/ 24 января 2020

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

Для вашего случая использования вам может потребоваться установить continueParent="true" в IterateMediator , чтобы посредничество продолжалось после повторного посредника для операции вставки в базу данных.

0 голосов
/ 24 января 2020

Спасибо за помощь, Арунан!

После вашего ответа я пытаюсь добавить агрегатор следующим образом
Adding the Aggregator Mediator

Конфигурация агрегатора следующая:

...
 <aggregate id="NIRO">
                                    <completeCondition>
                                        <messageCount max="-1" min="-1"/>
                                    </completeCondition>
                                    <onComplete expression="//jsonObject">
                                        <log description="" level="full" separator=";">
                                            <property expression="json-eval($.)" name="jsonObject"/>
                                        </log>
                                    </onComplete>
                                </aggregate>
                            </sequence>
                        </target>
                    </iterate>

К сожалению, я изменяю свойство итератора 'Continue Parent' на 'true'. Но проблема сохраняется ....

...