Java Sping Cloud Stream Kafka-以批处理模式使用消息,并作为单个处理的消息发送出去

Java Sping Cloud Stream Kafka-以批处理模式使用消息,并作为单个处理的消息发送出去,java,spring-cloud-stream,spring-cloud-stream-binder-kafka,Java,Spring Cloud Stream,Spring Cloud Stream Binder Kafka,我试图为下一个春季云流发布准备我们的应用程序。(目前使用的是3.0.0.RC1)。 使用卡夫卡活页夹 现在,我们收到一条消息,对其进行处理并将其重新发送到另一个主题。单独处理每条消息会导致对数据库的大量单个请求 在3.0.0版本中,我们希望以批处理的方式处理消息,以便在批更新中保存数据 在当前版本中,我们使用@EnableBinding、@StreamListener @StreamListener( ExchangeableItemProcessor.STOCK_INPUT ) public

我试图为下一个春季云流发布准备我们的应用程序。(目前使用的是3.0.0.RC1)。 使用卡夫卡活页夹

现在,我们收到一条消息,对其进行处理并将其重新发送到另一个主题。单独处理每条消息会导致对数据库的大量单个请求

在3.0.0版本中,我们希望以批处理的方式处理消息,以便在批更新中保存数据

在当前版本中,我们使用@EnableBinding、@StreamListener

@StreamListener( ExchangeableItemProcessor.STOCK_INPUT )
public void processExchangeableStocks( final ExchangeableStock item ) {
    publishItems( exchangeableItemProcessor.stocks(), articleService.updateStockInformation( Collections.singletonList( item ) ) );
}

void publishItems( final MessageChannel messageChannel, final List<? extends ExchangeableItem> item ) {
    for ( final ExchangeableItem exchangeableItem : item ) {
        final Message<ExchangeableItem> message = MessageBuilder.withPayload( exchangeableItem )
                            .setHeader( "partitionKey", exchangeableItem.getId() )
                            .build();
        messageChannel.send( message )
    }
}
@StreamListener(ExchangeAbleTemProcessor.STOCK\u输入)
公共作废ProcessExchangeAbleStock(最终ExchangeableStock项目){
publishItems(ExchangeAbleTemProcessor.stocks()、articleService.updateStockInformation(Collections.singletonList(item));
}

void publishItems(最终消息通道消息通道,最终列表IIRC,批处理模式仅支持函数

您不能像当前在StreamListener中那样使用
消费者>
并将消息发送到频道吗?

我已经管理好了:

@Bean
@Measure
public Consumer<List<ExchangeableStock>> stocks() {
    return items -> {
        for ( final ExchangeableStock exchangeableItem : articleService. updateStockInformation( items ) ) {
            final Message<?> message = MessageBuilder.withPayload( exchangeableItem )
                            .setHeader( "partitionKey", exchangeableItem.getId() )
                            .setHeader( KafkaHeaders.TOPIC, "stocks-stg" )
                            .build();

            processor.onNext( message );
        }
    };
}

private final TopicProcessor<Message<?>> processor = TopicProcessor.create();

@Bean
@Measure
public Supplier<Flux<?>> source() {
    return () -> processor;
}
@Bean
@量
公众消费类股(股){
退货项目->{
用于(最终交换存储交换项:articleService.updateStockInformation(项目)){
最终消息消息=MessageBuilder.withPayload(exchangeableItem)
.setHeader(“分区键”,exchangeableItem.getId())
.setHeader(KafkaHeaders.TOPIC,“股票stg”)
.build();
处理器.onNext(消息);
}
};
}
私有最终TopicProcessor>source(){
return()->处理器;
}
但动态目标解析对我不起作用。 我尝试使用
KafkaHeaders.TOPIC
spring.cloud.stream.sendto.destination
作为标题,并设置Kafka绑定生产者属性
use-TOPIC-header:true
(用于绑定
source-out-0

如果我为
source-out-0
设置了一个目的地,它会工作,但这样做会导致大量
TopicProcessor
s和
Supplier
s-我们有大约10种不同的消息类型


也许我错过了一些让动态目标解析工作的小东西…

我尝试过,但当我添加
@EnableBinding(exchangeablietemprocessor.class)时
应用程序将不会启动。
org.springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为“org.springframework.cloud.stream.binding.MessageConverterConfigure”的合格bean可用:至少需要1个符合autowire候选项条件的bean。依赖项批注:{}
如果我删除了功能样式,应用程序将以相同的绑定界面运行,但随后会出现
列表
消息。
@Bean
@Measure
public Consumer<List<ExchangeableStock>> stocks() {
    return items -> {
        for ( final ExchangeableStock exchangeableItem : articleService. updateStockInformation( items ) ) {
            final Message<?> message = MessageBuilder.withPayload( exchangeableItem )
                            .setHeader( "partitionKey", exchangeableItem.getId() )
                            .setHeader( KafkaHeaders.TOPIC, "stocks-stg" )
                            .build();

            processor.onNext( message );
        }
    };
}

private final TopicProcessor<Message<?>> processor = TopicProcessor.create();

@Bean
@Measure
public Supplier<Flux<?>> source() {
    return () -> processor;
}