【发布时间】:2017-11-22 22:35:11
【问题描述】:
在我的用例中,最简单的集成组件安排是什么:
- 接收来自多个来源和多种格式的消息(所有消息都是 JSON 序列化对象)。
- 将消息存储在缓冲区中长达 10 秒(聚合)
- 通过不同的类属性 getter 对消息进行分组(例如 class1.someId()、class2.otherId()、...)
- 释放所有分组的消息并转换为新的聚合消息。
到目前为止(第 1 点和第 2 点),我正在使用聚合器,但不知道是否有针对问题 3 的开箱即用解决方案。) - 否则我将不得不尝试投射每条消息和检查对象的类型是否为 class1 - 然后使用相关策略 someId,如果是 class2,则使用 otherId。
对于问题 4.) - 我可以手动编写代码 - 但 Transformer 似乎是一个很好用的组件,我只是不知道是否有类似聚合转换器之类的东西,我可以在其中为每种输入类型指定映射规则。
更新
类似这样的:
class One{
public String getA(){ return "1"; }
}
class Two{
public Integer getB(){ return 1; }
}
class ReduceTo{
public void setId(Integer id){}
public void setOne(One one){}
public void setTwo(Two two){}
}
public class ReducingAggregator {
@CorrelationStrategyMethod
public String strategy(One one){
return one.getA();
}
@CorrelationStrategyMethod
public String strategy(Two two){
return two.getB().toString();
}
@AggregatorMethod
public void reduce(ReduceTo out, One in){
out.setId(Integer.valueOf(in.getA()));
out.setOne(in);
}
@AggregatorMethod
public void reduce(ReduceTo out, Two in){
out.setId(in.getB());
out.setTwo(in);
}
}
我想,注释的用例与当前的 spring 不同。 RediceTo 可以是任何对象,包括集合。在配置中,我们可以指定第一次传递的时间应该是空列表还是其他(如 java 流中的 reduce)。
【问题讨论】:
标签: java spring spring-integration