【问题标题】:Publish multiple messages in batch processing function with Spring cloud stream Kafka Binder使用 Spring Cloud Stream Kafka Binder 在批处理功能中发布多条消息
【发布时间】:2021-05-25 07:44:31
【问题描述】:

我正在寻找一个使用 spring cloud stream kafka binder(没有 Kafka Streams)创建函数式处理器的示例,该处理器可以消耗来自一个主题的一批 n 条消息并将 m 条消息发布到另一个主题(m

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 更改为 Flux,然后返回 Flux.fromIterable(aggregationResults),这似乎是在发布多条消息,但这些消息似乎是带有属性的 Flux 的序列化实例scanAvailable 和预取而不是实际的消息。 我在网上找不到任何实现这一目标的例子。看到这样的例子会很有帮助。

【问题讨论】:

    标签: apache-kafka spring-cloud-stream spring-cloud-stream-binder-kafka


    【解决方案1】:

    我认为不支持;使用Consumer&lt;List&lt;IncomingEvent&gt;&gt; 并使用StreamBridge 发布出站消息。

    https://docs.spring.io/spring-cloud-stream/docs/3.1.2/reference/html/spring-cloud-stream.html#_sending_arbitrary_data_to_an_output_e_g_foreign_event_driven_sources

    编辑

    看来我错了;见https://github.com/spring-cloud/spring-cloud-stream/issues/2143

    这是一个文档请求。云流框架支持一个未记录的功能,可以使用public Function&lt;Whatever, List&lt;Message&lt;POJO&gt;&gt;&gt; myMethod() 之类的方法签名发布一批消息。这会导致列表中的每条消息都由活页夹单独发布。

    如果它不适合你,我建议你对这个问题发表评论。

    【讨论】:

    • 我添加了一个更新 - 它应该可以工作。
    • 消息的批量生产现已记录在案 - docs.spring.io/spring-cloud-stream/docs/3.1.3-SNAPSHOT/…
    • @OlegZhurakousky - 正如我在 github 问题中提到的(尽管在问题解决后不久),我无法重现该行为,至少使用 spring cloud stream 3.0.1-RC1 和配置为以批处理模式运行的绑定。但是,Gary 的建议(使用流桥)对我有用,这就是为什么我将其标记为已接受的答案。
    • 请使用 3.1.2 或 3.1.3-SNAPSHOT,因为无论如何我们明天都会发布
    猜你喜欢
    • 1970-01-01
    • 2022-01-22
    • 2018-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-12
    • 2019-08-13
    相关资源
    最近更新 更多