WSO2 ESB,如何处理迭代器/聚合中的超时



我正在从几个月的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.

除此之外,没有重定向到故障序列。

在您的问题中,您要求通过错误汇总响应。如果可以,请在您的问题上解释更多。

  • 但我必须解释,响应与错误是使用不同机制来处理的。汇总的超时不会重定向到故障序列。

注意:正如我在您的样本中看到的那样,您应该将聚合调解器放入序列中,而不是添加到不序列中。

希望这将有助于您获得答案。如果您需要更多澄清,请对此问题发表评论。

相关内容

  • 没有找到相关文章