【问题标题】:Spring Integration - aggregate and transformSpring Integration - 聚合和转换
【发布时间】:2017-11-22 22:35:11
【问题描述】:

在我的用例中,最简单的集成组件安排是什么:

  1. 接收来自多个来源和多种格式的消息(所有消息都是 JSON 序列化对象)。
  2. 将消息存储在缓冲区中长达 10 秒(聚合)
  3. 通过不同的类属性 getter 对消息进行分组(例如 class1.someId()、class2.otherId()、...)
  4. 释放所有分组的消息并转换为新的聚合消息。

到目前为止(第 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


    【解决方案1】:

    不确定您希望看到的开箱即用解决方案是什么。那是你的课程,所以你的方法。框架如何对它们做出一些决定?

    嗯,是的,你需要实现CorrelationStrategy。或者您可以考虑使用ExpressionEvaluatingCorrelationStrategy 并且不要编写Java 代码:-)。

    请详细说明您希望看到的开箱即用功能。

    aggregating transformer 完全封装在聚合器的MessageGroupProcessor 函数中。默认为DefaultAggregatingMessageGroupProcessor。是的,您可以自己编写代码或再次编写代码 - 使用 ExpressionEvaluatingMessageGroupProcessor 并且不要再次编写 Java 代码 :-)

    【讨论】:

    • 不,框架中没有关于此事的任何内容。你应该坚持我给你的建议——自定义CorrelationStrategy和自定义MesaageGroupProcessor。我什至建议使用特定于该类型的功能将不同的对象发送到不同的聚合器。 MethodInvokingCorrelationStrategy 可以通过负载类型选择目标方法来调用。
    • 感谢您的信息。我可能会使用 MethodInvokingCorrelationStrategy,如果 MethodInvokingMessageGroupProcessor 尚不存在,则自定义实现。
    • 聚合器已经是非常复杂的组件。添加一些基于新注释集的智能逻辑会使它变得更加复杂。人们越来越关注函数式编程,其中一个优点是避免注释限制的简单方法。所以 Java DSL 适合你