在进入出站频道之前,代码接受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)的新手,我搜索了很多时间相关的聚合器,找不到任何有用的来源,请建议。
谢谢!
答案 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天。