我正在尝试使用spring-integration来聚合来自N个来源的数据。在实现关联策略时,我的理解受到挑战,因为我没有在需要使用的所有数据源之间存在公共ID。例如:
数据源消息(MainID,SubIDTwo)
数据源B消息(MainID,SubIDOne,SubIDTwo)
数据源C消息(SubIDOne)
数据源D消息(SubIDTwo)
将所有数据源集中在一起,可以合并数据集。但是,在该示例中,数据源D没有直接映射到数据源C.只能使用数据源B实现此映射。无法预测所有消息的接收时间,因此在某些情况下数据源D' s消息可能在数据源B之前到达,而在其他数据源B可能在数据源D之前到达。接收所有消息的预期时间可能长达几个小时。我也不能依赖于收到的所有消息,因此任何仅依赖于单个数据源(如数据源B)的策略都不会解决所有潜在的情况。大多数样本都假设一个共同的id:
public Object getCorrelationKey(Message<?> interactionMessage) {
MessageHeaders headers = interactionMessage.getHeaders();
if(headers.containsKey("MAINID")) return headers.get("MAINID");
return null;
}
参考指南对于Spring如何处理关联策略中的返回Object有点模糊。此Object可以包含每个ID的属性吗?Override equal方法如果任何ID匹配或者这是一个无效的方法,则返回true?
答案 0 :(得分:0)
执行此操作的一种方法可能是使用自定义MessageGroupStore
。
消息D到达群组,说D:bar
消息C到达群组,说C:baz
消息A到达(真实)组foo
- 消息存储将消息D移至组foo
,删除组D:bar
消息B到达(真实)组foo
- 消息存储将消息C移动到组foo
,删除组C:baz
你还需要地图来处理在C,D之前到达的A,B - 所以你知道真实的群体已经存在。