После прочтения ссылок на EI в WSO2 я все еще не понимаю, как использовать итераторы внутри последовательности EI. В моем случае у меня есть полезная нагрузка, подобная этой ...
{
...
"array": [
{"cpf": "12345678911"},
{"cnpj":"12345678912346"}
]
}
Поэтому я должен повторить, чтобы проверить, существуют ли эти парни с помощью других веб-сервисов. для достижения этого потока я использую посредник итерации, чтобы разделить сообщение, а затем строю логи c, чтобы выполнить эти проверки следующим образом.
Код, который реализует это изображение, выглядит следующим образом:
<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>{
"code":"400",
"error":"CPF inexistente"
}</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>{
"code":"400",
"error":"CNPJ inexistente"
}</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?