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