我构建了一个API,该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"
}
]
}
由于某些原因,来自端点之一的响应之一被重复。我尝试将请求重新触发到ESB上的API,但它总是会重复其中一种响应。您能通过查看我的聚合介体配置并查看是否有任何错误来帮助我吗?和往常一样,谢谢。
答案 0 :(得分:0)
似乎您的Enrich中介正在解决问题。为了清楚起见,我尝试解释一个示例,它不是Aggregator
的工作原理,但是它可以弄清楚问题的原因。通过接收第一个响应,它将//tasks
丰富到body
。通过收到第二个响应,它再次执行相同的操作,就像您可能会猜到的那样,body
在//tasks
下已经有内容,因此第二次它聚合了两个//tasks
。 / p>
最好使用其他属性而不是丰富身体。