Spring Integration - 聚合和转换

时间:2017-11-22 22:35:11

标签: java spring spring-integration

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

  1. 从多个来源以多种格式接收消息(所有消息都是JSON序列化对象)。
  2. 将消息存储在缓冲区中最多10秒(聚合)
  3. 按不同的类属性getter对消息进行分组(例如class1.someId(),class2.otherId(),...)
  4. 释放所有已分组的邮件并转换为新的聚合邮件。
  5. 到目前为止(第1点和第2点),我正在使用聚合器,但不知道是否有解决问题的解决方案在3.) - 或者我将不得不尝试转换每个消息和检查对象的类型是否为class1 - 然后使用correlationstrategy someId,如果是class2,则使用otherId。

    对于问题4.) - 我可以手动编写代码 - 但是Transformer似乎是一个很好用的组件,我只是不知道是否有类似聚合变换器的东西,我可以为每个输入类型指定映射规则。 / p>

    更新

    这样的事情:

    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);
        }
    }
    

    我认为,注释具有与当前春季不同的用例。 RediceTo可以是包括集合在内的任何对象。在配置中,我们可以指定何时第一次传递它应该是空列表还是别的东西(比如java流中的reduce)。

1 个答案:

答案 0 :(得分:1)

不确定您希望将其视为开箱即用的解决方案。那是你的课程,所以你的方法。框架如何对它们做出决定?

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

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

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

相关问题