【问题标题】:Collection aggregator not aggregating response properly Mule ESB集合聚合器未正确聚合响应 Mule ESB
【发布时间】:2015-01-20 23:19:07
【问题描述】:

我有流量,我将在根标签Items 下有多个Item。我有拆分器,它拆分每个项目并进行一些处理。之后,我将使用 Collection 聚合器收集所有响应。

在我的流程中,观察到的集合聚合器正在等待某些东西,尽管所有响应都已经到达聚合器。在聚合器之后没有收集响应(因为它正在等待一些响应)。 但我敢肯定(如果 Items 中有 5 个项目),所有响应都会到达聚合器。但不确定为什么聚合器仍然没有传递它的输出(但有时它正在传递)

如果我在聚合器中保持超时 30000 并且在超时 =“false”时失败,现在它已被传递出去,它正在聚合响应(5 个项目)。

但我很确定,消息会在 20000 毫秒内到达聚合器。但它一直在等待一些东西:(。

为什么集合聚合器会出现这种行为。有没有人有线索?请找到配置..

    <flow name="Items" doc:name="Items">
    <vm:inbound-endpoint exchange-pattern="one-way" path="QUEUE" connector-ref="VM_Q1" doc:name="QUEUE">
    </vm:inbound-endpoint>
    <splitter expression="#[xpath('/Items/Item')]" doc:name="Splitter"/>
  <vm:outbound-endpoint exchange-pattern="one-way" path="OUT1" connector-ref="MAIN_VM" doc:name="Test Queue">
 </flow>

  <flow name="Items1" doc:name="Items">
  <vm:inbound-endpoint exchange-pattern="one-way" path="OUT1" connector-ref="MAIN_VM" doc:name="Test Queue"/>
.............doing some transformation and processing.....
<collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>  
  </flow>

使用版本:3.5.1 我们如何追踪它到底在等待什么?我保留了记录器并检查了聚合器之前填充的所有 5 个项目。 帮助将不胜感激。谢谢。

编辑: 每次迭代 Item 后的 splitter 组件后的日志

  After splitter:{MULE_CORRELATION_SEQUENCE=1, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686}
 After splitter:{MULE_CORRELATION_SEQUENCE=2, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686}
 After splitter:{MULE_CORRELATION_SEQUENCE=3, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686}
 After splitter:{MULE_CORRELATION_SEQUENCE=4, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686}
 After splitter:{MULE_CORRELATION_SEQUENCE=5, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686}

收集聚合器之前的日志

  Before Collection Aggregator:{MULE_CORRELATION_SEQUENCE=1, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=13783281-a036-11e4-a356-b8ee652d2686, Content-Type=text/plain;charset=UTF-8}
  Before Collection Aggregator:{MULE_CORRELATION_SEQUENCE=2, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686, Content-Type=text/plain;charset=UTF-8}
  Before Collection Aggregator:{MULE_CORRELATION_SEQUENCE=2, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686, Content-Type=text/plain;charset=UTF-8}
  Before Collection Aggregator:{MULE_CORRELATION_SEQUENCE=2, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686, Content-Type=text/plain;charset=UTF-8}
 Before Collection Aggregator:{MULE_CORRELATION_SEQUENCE=2, MULE_CORRELATION_GROUP_SIZE=5, MULE_ENCODING=UTF-8, MULE_CORRELATION_ID=9f7447b1-a03b-11e4-85dd-b8ee652d2686, Content-Type=text/plain;charset=UTF-8} 

@David 请建议。 MULE_CORRELATION_SEQUENCE=2 重复多次。但是对于每个correlation_seq=2,获取有效负载是正确的并且不同。如何解决这个问题?

【问题讨论】:

  • 您能否记录Items1 中收到的消息的MULE_CORRELATION_IDMULE_CORRELATION_GROUP_SIZEMULE_CORRELATION_SEQUENCE 属性的值?我想知道这些是否具有正确的聚合值。
  • @DavidDossot 你完全正确。我已经在拆分器之后使用日志编辑了我的问题,并在收集聚合器之前使用了日志。请看一眼。据观察,MULE_CORRELATION_SEQUENCE = 2 重复多次(不允许 seq=3,4,5)。怎样才能摆脱这种情况。
  • @DavidDossot 某些情况下集合聚合器被传递出去(传播响应)。即使在那些情况下,我观​​察到 MULE_CORRELATION_SEQUENCE = 2 就像上面的失败场景一样重复。但是这里的集合聚合器取得了成功。我不确定如何预测这一点。示例:如果我调用 5 个案例,其中 4 个为失败(消息未从聚合器中收集),1 个为成功(聚合器可以将消息传递出去)。

标签: mule mule-studio mule-el mule-component


【解决方案1】:

我的直觉是 doing some transformation and processing 中的某些东西正在破坏这些控件属性,从而阻止聚合工作。

我意识到很容易指出上面未显示的内容,但日志显示控件属性的明显更改,因此它必须发生在此引出块中的某处。

【讨论】:

  • 感谢您提供信息。导致问题的问题是在 Item2 流程中我有缓存。第一次到达缓存'MULE_CORRELATION_SEQUENCE = 2'并保存在缓存中,但不久之后当其他序列在缓存后达到'MULE_CORRELATION_SEQUENCE = 3'时,我在日志中看到它仍然打印为'MULE_CORRELATION_SEQUENCE = 2'。对其他人也是如此。我期望只有有效负载存储在缓存中,但它也保存了所有 OUTBOUND 属性。所以在外部,我将 OUT PROPERTIES 保存在变量中,一旦从缓存中取出,我就会恢复它。但这是一种正确的做法吗?
  • 有什么方法可以防止将 OUTBOUND 属性存储在缓存中。所以它只存储有效载荷。它阻止我在缓存之前在外部存储所有 OUTBOUND 属性(与集合相关)并在缓存之后再次将其设置回来。另外我不确定,我目前正在做的方式是正确的方法吗?但它正在工作。您能否就此提出建议。
  • 你用什么做缓存?
  • 内部缓存我正在使用数据库(调用存储过程)。手段(在缓存范围内,我有数据库、java 组件和 DOM 到 xml)。因为每次我打电话时,响应都是一样的。所以我刷新缓存半小时。
  • 哦,你使用缓存范围。这是一个 EE 功能,所以源代码不可用,所以我真的看不出它是如何工作的,以及为什么它会对你的消息做这些奇怪的事情。由于您是 Mule Enterprise 客户,我建议您联系专业支持并向他们提出问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多