我正在从几个月的WSO2 ESB上工作,我需要暂时使用迭代介质分开传入的消息,将每个零件发送到终点并使用聚合调解人。这样的东西:
<iterate expression="//element" id="ELEMENTS">
<target>
<sequence>
[send to endpoint using element data]
</sequence>
</target>
</iterate>
<property name="root" scope="default">
<root xmlns=""/>
</property>
<aggregate id="ELEMENTS">
<completeCondition timeout="12">
<messageCount max="-1" min="-1"/>
</completeCondition>
<onComplete enclosingElementProperty="root" expression="//resultelement">
[rest of the flow]
</onComplete>
</aggregate>
它可以正常工作,但是,如您所见,我在聚合器上定义了一个时间,因此超时的消息不会"聚合",并且会"重定向"到故障序列。一般而言,发送给故障序列的任何消息都会"错过"聚合器,因此问题是:有任何方法可以在一条消息中汇总答案和错误?
"计划B"基于在故障序列中创建的单个错误消息,并使用响应调解人发回,但在多个错误时,我注意到ESB日志中的null指针异常,我假设由于多个试图使用响应调解人的过程。
谢谢
编辑:
我是ESB的新手,所以可能我有错误的想法,所以我会尝试用一个例子来解释我的情况。我正在尝试创建一个将收到这样的有效载荷的REST API:
{
"items" : [
"ID_ITEM_1",
"ID_ITEM_2",
"ID_ITEM_3"
]
}
api config :
<?xml version="1.0" encoding="UTF-8"?>
<api context="AAA/report" name="order-request" xmlns="http://ws.apache.org/ns/synapse">
<resource methods="POST" protocol="http">
<inSequence>
<iterate expression="//items" id="ITEMS">
<target>
<sequence>
<property expression="json-eval($.items)" name="item"/>
<call-template description="Get status" target="gov:/calls/GetItemStatusTemplate.xml">
<with-param name="itemId" value="{get-property('item')}"/>
</call-template>
<payloadFactory media-type="json">
<format>
{
"item" : "$1",
"status" : "$2"
}
</format>
<args>
<arg expression="get-property('item')"/>
<arg evaluator="json" expression="$.status"/>
</args>
</payloadFactory>
</sequence>
</target>
</iterate>
<property name="report" scope="default">
<report xmlns=""/>
</property>
<aggregate id="ITEMS">
<completeCondition timeout="12">
<messageCount max="-1" min="-1"/>
</completeCondition>
<onComplete enclosingElementProperty="report" expression="//jsonObject">
<respond/>
</onComplete>
</aggregate>
</inSequence>
<outSequence/>
<faultSequence>
<log level="full">
<property name="FAULT_SEQUENCE" value="IN"/>
</log>
<respond/>
</faultSequence>
</resource>
</api>
getItemStatustemplate将使用该itemID执行以下端点的调用:
<call>
<endpoint>
<address trace="disable" uri="http://something">
<timeout>
<duration>10000</duration>
<responseAction>fault</responseAction>
</timeout>
<suspendOnFailure>
<errorCodes>-1</errorCodes>
<initialDuration>0</initialDuration>
<progressionFactor>1.0</progressionFactor>
<maximumDuration>0</maximumDuration>
</suspendOnFailure>
<markForSuspension>
<errorCodes>-1</errorCodes>
</markForSuspension>
</address>
</endpoint>
</call>
让我们假设端点的答案类似于:
{
"status" : "OK"
}
因此,API对原始请求的答案(如果没有超时)应该是这样的:
{
"report" : [
{
"item" : "ID_ITEM_1",
"status" : "OK"
},
{
"item" : "ID_ITEM_2",
"status" : "NOT VALID"
},
{
"item" : "ID_ITEM_3",
"status" : "OK"
}
]
}
如果item_3的请求在超时到期,答案将是:
{
"report" : [
{
"item" : "ID_ITEM_1",
"status" : "OK"
},
{
"item" : "ID_ITEM_2",
"status" : "NOT VALID"
}
]
}
,但我的想法是创建与此类似的东西:
{
"report" : [
{
"item" : "ID_ITEM_1",
"status" : "OK"
},
{
"item" : "ID_ITEM_2",
"status" : "NOT VALID"
},
{
"item" : "ID_ITEM_3",
"status" : "request timeout"
}
]
}
或一种在item_3
在您的问题中,您要求在聚合中调解"超时"。
- 在完成条件下用于处理聚合过程的超时。如果响应无法满足超时期,它将停止聚合过程。
将有以下警告:
WARN - Aggregate Aggregate Mediator Time out occured.
除此之外,没有重定向到故障序列。
在您的问题中,您要求通过错误汇总响应。如果可以,请在您的问题上解释更多。
- 但我必须解释,响应与错误是使用不同机制来处理的。汇总的超时不会重定向到故障序列。
注意:正如我在您的样本中看到的那样,您应该将聚合调解器放入序列中,而不是添加到不序列中。
希望这将有助于您获得答案。如果您需要更多澄清,请对此问题发表评论。