群组超时如何工作?

时间:2014-05-26 20:00:30

标签: spring-integration

聚合器是一个被动组件,只有在收到新消息时才会触发释放逻辑。然后群组超时如何工作?

它是一个类似于收割机的计划任务,它会持续监控聚合器的状态。这是否也意味着它反复评估group-timeout-expression以确定group-timeout的值,还是在开始时评估一次?我假设,因为有一些基于有效载荷大小的例子,这意味着它必须反复评估group-timeout-expression,但如果是这样的话,这种情况经常发生多少次?可以控制/修改评估频率。如果聚合器是POJO,则沿着相同的行,此组超时功能已经足够灵活,可以从POJO方法指定时间。

我注意到的另一个有趣的事情是,对于我的group-timeout-expression,我正在尝试一个拼写表达式并且正在传递有效负载或标题,但那些显然在上下文中不可用。看起来像这个group-timeout-expression中的上下文指向SimpleMessageGroup,它没有有效负载或头属性。那么,如何在group-timeout-expression的spel表达式中访问有效负载或头文件?

实际上在我的情况下,我想要实际的消息(有效载荷周围的包装器)因为我的方法签名需要传递给它的实际SI消息而不是有效载荷。

1 个答案:

答案 0 :(得分:2)

  1. 在Spring Integration 4.0之前,聚合器是一个被动组件,您必须配置MessageGroupStoreReaper到期组。

  2. {4.0}中添加了group-timeout*个属性;当新消息到达时,任务被安排为超时该组。如果下一条消息在超时之前到达,则任务被取消,新消息将添加到组中,如果发布没有发生,则会安排新任务。每次重新评估表达式(example in the documentation looks at the group size)。

  3. 是的,表达式评估的根对象是消息组。

    哪个"有效负载和标头"你需要吗?组中可能有多条消息。您可以使用one.payloadone.headers['foo']轻松访问组中的第一条消息(这些表达式使用group.getOne()查看组中的第一条消息。)

    如果您需要访问其他消息,则需要编写一些代码来迭代组中的消息。我们目前还没有,但是可以将新到达的消息作为变量#newMessage或类似信息提供;随时打开一个改进' JIRA issue for that