如何从下一个Transformer模块中的Spring云数据流聚合器应用程序输出中提取Collection有效负载记录

时间:2019-03-06 05:37:21

标签: spring-integration spring-cloud-stream spring-cloud-dataflow

我正在使用SCDF [Spring Cloud Data Flow],并且在我的流中,我正在聚合有效负载,并且在下一个转换器模块中,我想要获取接收到的有效负载的大小[这是聚合器应用程序根据聚合功能输出的收集对象]

示例流:

stream create file_agr_trc_log  --definition "file --directory=/Users/keerthikanth/Documents/GroovySampleCodes/test  --filename-pattern='UNITINFO_DWH.txt' --mode=lines --outputType=plain/text   | aggregator  --release='size() == 1000'  --aggregation=\"#this.![new String(payload)]\" --group-timeout=4 --message-store-type=simple  --correlation='T(Thread).currentThread().id'   | log " --deploy

文件 /Users/keerthikanth/Documents/GroovySampleCodes/test/UNITINFO_DWH.txt包含

A

B

C

D

E

F

G

H

执行流后,使用聚合[--aggregation = \“#this。![new String(payload)] \”]的Aggregator应用在日志应用中生成了如下所示的集合

[A,B,C,D,E,F,G,H,I]

实际问题:

当我在聚合器应用程序之后应用新的自定义转换器应用程序以查找集合的大小和第一条记录时,当我尝试获取集合的第一条记录时,我得到了错误的记录,即以[作为第一个元素“,”作为第二个元素“ A”作为第三个元素。

因此,当间接地从聚合器模块输出收集有效负载时,它将转换为字符串。

我试图在聚合器和spring.cloud.stream.bindings.input中应用spring.cloud.stream.bindings.output.content-type ='application / x-java-object; type = java.util.List' .content-type ='application / x-java-object; type = java.util.List'在自定义转换器中,但仍面临着同样的问题,就像它正在考虑将所有元素视为集合的一部分,包括[,]字符

另一个具有内容类型的流


stream create file_agr_trc_log  --definition "file --directory=/Users/keerthikanth/Documents/GroovySampleCodes/test  --filename-pattern='UNITINFO_DWH.txt' --mode=lines --outputType=plain/text   | aggregator --aggregation=\"#this.![new String(payload)]\"  --release='size() == 1000' --group-timeout=4 --message-store-type=simple  --correlation='T(Thread).currentThread().id' --spring.cloud.stream.bindings.output.content-type='application/x-java-object;type=java.util.List'  |  transCount --spring.cloud.stream.bindings.input.content-type='application/x-java-object;type=java.util.List'   | log " --deploy

客户变压器:

@EnableBinding(Processor.class)
public class processorApp {
  @ServiceActivator(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
  public String transformer(Collection payloadList)  {
     System.out.println("Size of Payload" + payloadList.size());
    System.out.println("Payload "+ payloadList.iterator().next().toString() );

     return payload;
}

任何人都可以建议我如何从自定义转换器中的聚合器应用中获取接收到的集合有效负载的大小。即使在应用内容类型之后也没有考虑。即使使用默认聚合,情况也与提供列表输出相同,但是接收转换器将每个字符都视为列表的元素

我的输出应该像第一个元素-该集合中元素的总大小

A-8尺寸

1 个答案:

答案 0 :(得分:0)

如果您的聚合应用程序实际上根据您提供的指令--aggregation=\"#this.![new String(payload)]\"生成String,那么您为什么希望它是一个集合。

基本上,您不需要为案例提供任何 aggregation选项,因为它将默认为java.util.List。有关更多详细信息,请参见聚合者的README