Spring集成聚合器时间到期 - 问题

时间:2015-07-30 07:19:10

标签: spring spring-integration

在进入出站频道之前,代码接受2条消息。

<bean id="timeout"
    class="org.springframework.integration.aggregator.TimeoutCountSequenceSizeReleaseStrategy">
    <constructor-arg name="threshold" value="2" />
    <constructor-arg name="timeout" value="7000" />
</bean> 

<int:aggregator ref="updateCreate" input-channel="filteredAIPOutput" 
        method="handleMessage" release-strategy="releaseStrategyBean" release-strategy-method="timeout">
</int:aggregator>

我的用例是整理所有邮件10分钟并将其发送到出站频道。不是基于如上所示的消息计数。 要实现此基于时间的功能,请使用以下代码:

<int:aggregator ref="updateCreate" input-channel="filteredAIPOutput" 
        method="handleMessage" 
                output-channel="outputappendFilenameinHeader" >
</int:aggregator>

<bean id="updateCreate" class="helper.UpdateCreateHelper"/>

我传递了10条消息,PojoDateStrategyHelper调用了10次调用方法。

尝试使用时差逻辑实现PojoDateStrategyHelper,它按预期工作。 10分钟后调用UpdateCreateHelper类,但它只收到1条消息(最后一条消息)。剩下的9封邮件在任何地方都看不到。我在这做错什么吗?邮件未整理。

我怀疑在SI中应该有一些东西可以实现,如果我通过10分钟作为参数,一旦它超过10分钟时间,它应该将所有消息传递到出站通道。

这是我的UpdateCreateHelper.java代码:

public Message<?> handleMessage(List<Message<?>> flights){

    LOGGER.debug("orderItems list ::"+flights.size()); // this is always printing 1

    MessageBuilder<?> messageWithHeader = MessageBuilder.withPayload(flights.get(0).getPayload().toString());
    messageWithHeader.setHeader("ftp_filename", "");

    return messageWithHeader.build();
}

@CorrelationStrategy
public String correlateBy(@Header("id") String id) {
    return id;
}
@ReleaseStrategy
public boolean canRelease(List<Message<?>> flights) {
    LOGGER.debug("inside canRelease ::"+flights.size()); // This is called for each and every message
    return compareTime(date.getTime(), new Date().getTime());
}

我是SI(v3.x)的新手,我搜索了很多时间相关的聚合器,找不到任何有用的来源,请建议。

谢谢!

2 个答案:

答案 0 :(得分:1)

启用DEBUG日志记录,了解您只能看到一条消息的原因。

  

我怀疑在SI中应该有一些内置的东西可以达到这个目的,......

在4.0版之前(以及默认情况下,之后),聚合器是一个完全被动的组件;只有在收到新消息时才会查阅发布策略。

4.0 added group timeout capabilities,可以在超时后释放(或丢弃)部分组。

但是,对于任何版本,您可以配置func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { if self.recipe?.ingredients.count == 0 { return 0 } else { return self.recipe!.ingredients.count } } 以在超时后释放部分完整的组。请参阅the documentation

答案 1 :(得分:1)

private String correlationId = date.toString();

@CorrelationStrategy
public String correlateBy(Message<?> message) {
    **// Return the correlation ID which is the timestamp the current window started (all messages should have the same correlation id)**
    return "same";
}

早些时候我正在返回Header ID,这与Message to Message不同。我希望这个解决方案可以帮助一些人。我忽略了这么小的概念,浪费了差不多2天。