当前位置: 首页 > 知识库问答 >
问题:

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

施慈
2023-03-14

我在WSO2 Esb上工作了几个月,现在我需要使用迭代器中介器拆分传入的消息,将每个部分发送到一个endpoint,并使用聚合中介器收集答案。类似于这样:

  <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的日志中注意到一个空指针异常,我认为这是由于多个进程试图使用响应中介器造成的。

编辑:

我是ESB新手,所以我可能有错误的想法,所以我将试着用一个例子来解释我的情况。我试图创建一个REST API,它将接收如下所示的有效负载:

{
    "items" : [
        "ID_ITEM_1",
        "ID_ITEM_2",
        "ID_ITEM_3"
    ]
}

API配置:

<?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>
<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"
}
{
    "report" : [
        {
            "item" : "ID_ITEM_1",
            "status" : "OK"
        },
        {
            "item" : "ID_ITEM_2",
            "status" : "NOT VALID"
        },
        {
            "item" : "ID_ITEM_3",
            "status" : "OK"
        }
    ]

}
{
    "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上出现错误的方法

共有1个答案

章阳波
2023-03-14

在您的问题中,您要求在聚合中介器中处理“超时”。

  • 在完成条件下用于处理聚合进程的超时。如果响应不符合超时期限,它将停止聚合进程。

将出现如下警告:

WARN - Aggregate Aggregate Mediator Time out occured.
    null
 类似资料:
  • 本文向大家介绍C ++中的组合迭代器,包括了C ++中的组合迭代器的使用技巧和注意事项,需要的朋友参考一下 假设我们必须设计一个Iterator类,其中包含少量操作- 定义一个构造函数,该构造函数将以不同的小写英文字母排序的字符串字符和一个数字CombineLength作为参数。 定义一个函数,该函数将按字母顺序返回长度combinationLength的下一个组合。 定义另一个函数,当且仅当存在

  • 问题内容: 我想将多处理池与迭代器一起使用,以便在将迭代器拆分为N个元素的线程中执行函数,直到迭代器完成为止。 我的问题是,此脚本是正确的方法吗?有没有更好的办法? 该脚本可能出了点问题,因为我在 问题答案: 如果我不得不猜测代码的主要问题,那是因为将您的代码传递给了流程函数-工作方式是解压缩传递给它的参数,因此您的函数实际上是获取参数,而不是列出一个参数的元素。这会在过程功能甚至没有机会启动之前

  • 嗨,伙计们,我把这个作为面试问题来回答,但我遇到了麻烦。我熟悉泛型/集合 问题是:所提供的工作区中包含cocI,它是一个类的开始,该类实现了一个迭代器,可用于迭代集合集合。集合集合被传递到类的构造函数中。迭代器应该首先遍历内容深度。 例如,如果集合集合如下所示: 然后迭代器应按以下顺序返回内容:“A”、“B”、“C”、“D”、“E”、“F” Q.在cocI中提供hasNext()和next()方法

  • 6 迭代器模式总结        迭代器模式是一种使用频率非常高的设计模式,通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成。由于很多编程语言的类库都已经实现了迭代器模式,因此在实际开发中,我们只需要直接使用Java、C#等语言已定义好的迭代器即可,迭代器已经成为我们操作聚合对象的基本工具之一。          1. 主要优点       

  • 5 JDK内置迭代器        为了让开发人员能够更加方便地操作聚合对象,在Java、C#等编程语言中都提供了内置迭代器。在Java集合框架中,常用的List和Set等聚合类都继承(或实现)了java.util.Collection接口,在Collection接口中声明了如下方法(部分): package java.util; public interface Collection<E> e

  • 4 使用内部类实现迭代器        在迭代器模式结构图中,我们可以看到具体迭代器类和具体聚合类之间存在双重关系,其中一个关系为关联关系,在具体迭代器中需要维持一个对具体聚合对象的引用,该关联关系的目的是访问存储在聚合对象中的数据,以便迭代器能够对这些数据进行遍历操作。        除了使用关联关系外,为了能够让迭代器可以访问到聚合对象中的数据,我们还可以将迭代器类设计为聚合类的内部类,JDK