我是Spring集成的新手。我试图使用文件拆分器从文件中拆分消息,然后使用.aggregate()构建单个消息并发送到输出通道。 我有标记为true,因此默认情况下apply-sequence为false。 我使用enrichHeaders将correlationId设置为常量“1”。我无法设置realease策略,因为我没有保留序列结束。以下是我的代码的外观。
IntegrationFlows
.from(s -> s.file(new File(fileDir))
.filter(getFileFilter(fileName)),
e -> e.poller(poller))
.split(Files.splitter(true, true)
.charset(StandardCharsets.US_ASCII),
e -> e.id(beanName)).enrichHeaders(h -> h.header("correlationId", "1"));
IntegrationFlow integrationFlow = integrationFlowBuilder
.<Object, Class<?>>route(Object::getClass, m -> m
.channelMapping(FileSplitter.FileMarker.class, "markers.input")
.channelMapping(String.class, "lines.input"))
.get();
@Bean
public IntegrationFlow itemExcludes() {
return flow -> flow.transform(new ItemExcludeRowMapper(itemExcludeRowUnmarshaller)) //This maps each line to ItemExclude object
.aggregate(aggregator -> aggregator
.outputProcessor(group -> group.getMessages()
.stream()
.map(message -> ((ItemExclude) message.getPayload()).getPartNumber())
.collect(Collectors.joining(","))))
.transform(Transformers.toJson())
.channel(customSource.itemExclude());
}
@Bean
public IntegrationFlow itemExcludeMarkers() {
return flow -> flow
.log(LoggingHandler.Level.INFO)
.<FileSplitter.FileMarker>filter(m -> m.getMark().equals(FileSplitter.FileMarker.Mark.END))
.<FileHandler>handle(new FileHandler(configProps))
.channel(NULL_CHANNEL);
}
任何帮助表示感谢。
答案 0 :(得分:1)
我会在correlationId
之前移动splitter
的标题,并将其设为:
.enrichHeaders(h -> h
.headerFunction(IntegrationMessageHeaderAccessor.CORRELATION_ID,
m -> m.getHeaders().getId()))
常量correlationId
在多线程环境中绝对不好:不同的线程分割不同的文件并将不同的行发送到同一聚合器。因此,使用"1"
作为相关键,您总是有一个要聚合和发布的组。默认的序列行为是将原始邮件id
填充到correlationId
。由于您不会依赖applySequence
中的FileSplitter
,因此我建议使用简单的解决方案来模拟该行为。
正如Gary在回答中指出的那样,您需要考虑自定义ReleaseStrategy
并将FileSplitter.FileMarker
发送给聚合器。 FileSplitter.FileMarker.END
具有lineCount
属性,可与MessageGroup.size
进行比较,以确定我们是否有权释放该群组。 MessageGroupProcessor
确实必须在构建输出结果时过滤FileSplitter.FileMarker
消息。
答案 1 :(得分:0)
使用自定义发布策略在最后一条消息中查找END标记,也许是一个从集合中删除标记的自定义输出处理器。