WSO2 ESB Aggregate Mediator отправляет больше сообщений, чем количество отправленных сообщений - PullRequest
0 голосов
/ 27 февраля 2019

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

        <outSequence>
        <aggregate id="GetOpenTasksReq">
            <completeCondition>
                <messageCount max="-1" min="-1"/>
            </completeCondition>
            <onComplete expression="//jsonObject" xmlns:m0="http://ws.wso2.org/dataservice">
                <log level="custom" separator=",">
                    <property name="MessageFlow" value="======================= Sending Back the Aggregated Responses. ==============="/>
                </log>
                <log level="full" separator=","/>
                <enrich>
                    <source clone="true" xpath="//tasks"/>
                    <target action="child" type="body"/>
                </enrich>
                <property name="messageType" value="application/json" scope="axis2"/>
                <send/> 
            </onComplete>
        </aggregate>
        <send/> 
    </outSequence>

Предполагалось, что он вернет

    {
  "tasks": [
    {
      "id": 10,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=10"
    },
    {
      "id": 1,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=1"
    },
    {
      "id": 33,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=33"
    }
  ]
}

Но вместо этого я получил:

    {
  "tasks": [
    {
      "id": 10,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=10"
    },
    {
      "id": 10,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=10"
    },
    {
      "id": 1,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=1"
    },
    {
      "id": 33,
      "desc": "New Assignment Item",
      "due": "2019-02-18T06:23:41+07:00",
      "link": "https://[host]:[port]/viewtask?id=33"
    }
  ]
}

По некоторым причинамодин из ответов от одной из конечных точек повторяется.Я попытался повторить запрос к API на ESB, но он всегда повторял один из ответов.Не могли бы вы помочь мне, посмотрев на мою совокупную конфигурацию посредника и выяснив, есть ли какая-либо ошибка?Как обычно, спасибо заранее.

1 Ответ

0 голосов
/ 02 марта 2019

Кажется, ваш посредник Enrich создает проблему.Чтобы прояснить ситуацию, я попытаюсь объяснить пример, это не совсем то, как работает Aggregator, но это может прояснить причину проблемы.Получив первый ответ, он обогащает //tasks до body.Получив второй ответ, он снова делает то же самое, как вы можете догадаться, в body уже есть что-то под //tasks, поэтому во второй раз он объединяет два //tasks.

ЭтоЛучше использовать другое свойство вместо обогащения тела.

...