我正在寻找一个示例来创建一个使用 spring cloud stream kafka binder(没有 Kafka Streams)的函数式处理器,它可以从一个主题消耗一批 n 条消息,并将 m 条消息发布到另一个主题 (m < n)。 我尝试了以下方法:
public Function<List<IncomingEvent>, List<Message<OutgoingEvent>>> aggregate() {
return ((batch) -> {
Map<Key, List<IncomingEvent>> resultsMap = batch.stream()
.collect(Collectors.groupingBy(result -> IncomingEvent::key));
List<Message<OutgoingEvent>> aggregationResults = new ArrayList<>();
for (Map.Entry<Key,List<IncomingEvent>> resultGroup : resultsMap.entrySet()) {
OutgoingEvent outgoingEvent = this.getOutgoingEvent(resultGroup.getKey(), resultGroup.getValue());
aggregationResults.add(
MessageBuilder.withPayload(outgoingEvent)
.setHeader(KafkaHeaders.MESSAGE_KEY, outgoingEvent.getKey())
.build()
);
}
return aggregationResults;
});
}
然而,这会产生一个带有一系列消息的事件。我尝试将函数的返回类型从 List
答案 0 :(得分:0)
我认为不支持;使用 Consumer<List<IncomingEvent>>
并使用 StreamBridge
发布出站消息。
编辑
看来我错了;见https://github.com/spring-cloud/spring-cloud-stream/issues/2143
<块引用>这是一个文档请求。云流框架支持一种未公开的功能,可以使用 public Function<Whatever, List<Message<POJO>>> myMethod()
之类的方法签名发布一批消息。这会导致列表中的每条消息都由活页夹单独发布。
如果它不适合您,我建议您对此问题发表评论。