如何在spring集成中使用聚合器对事件进行分组/批处理

时间:2018-01-05 14:05:52

标签: java spring spring-integration

我有一个通道,其有效负载是不同的POJO,实现了一个名为Event的接口。

public interface Event {
    String getEventType();
}

许多事件类型的事件使用网关逐个添加到通道。我想根据事件类型对事件进行分组,并调用服务激活器。该服务具有以下签名。

void processEventsInBatch(String eventType, List<Event> events);

在列表中获取属于同一事件类型的多个事件以批量处理它们并减少对外部服务的多个调用非常重要。

如何通过弹簧集成实现这一目标?

1 个答案:

答案 0 :(得分:2)

spring-integration中的聚合器使用correlation-id标头(默认情况下)来标识同一组中的不同消息。因此,第一步是将eventType作为correlation-id标头。稍后我们可以在服务激活器中将此标头作为eventType参数获取,因为对于聚合器创建的组,将存在correlation-id标头。这可以通过以下xml配置

来完成
<int:header-enricher>
    <int:correlation-id expression="payload.getEventType()"/>
<int:header-enricher>

现在可以使用聚合器,如下所示。

<int:aggregator release-strategy-expression="size() >= 25"
                group-timeout="5000"
                expire-group-upon-completion="true"
                send-partial-results-on-expiry="true" />

上述聚合器将在一个组中至少有25个事件或者等待5秒时发送一个组。我们可以调整前两个参数来控制列表的大小以及我们想要引入多少延迟。需要expire-group-upon-completion属性以确保聚合器继续创建具有相同correlation-id的新组。并且send-partial-results-on-expiry是必需的,以确保如果我们在5秒内得到少于25个事件,那么聚合器将发送一个具有它的内容的组。