Java 是否可以使用Kafka流访问消息头?
在Kafka 0.11中添加了记录(&),在处理带有Kafka流的主题时是否可以获取这些标题?在Java 是否可以使用Kafka流访问消息头?,java,apache-kafka,apache-kafka-streams,Java,Apache Kafka,Apache Kafka Streams,在Kafka 0.11中添加了记录(&),在处理带有Kafka流的主题时是否可以获取这些标题?在KStream上调用map等方法时,它提供了键的参数和记录的值,但我无法访问标题。如果我们能在消费者记录上绘制地图就好了 前 KStreamBuilder KStreamBuilder=new KStreamBuilder(); KStream stream=kStreamBuilder.stream(“某个主题”); 流动 .map((key,value)->…)//我可以访问map、filter、
KStream
上调用map
等方法时,它提供了键的参数
和记录的值
,但我无法访问标题
。如果我们能在消费者记录上绘制地图就好了
前
KStreamBuilder KStreamBuilder=new KStreamBuilder();
KStream stream=kStreamBuilder.stream(“某个主题”);
流动
.map((key,value)->…)//我可以访问map、filter、aggregate等方法中的头吗?
...
类似这样的方法会奏效:
KStreamBuilder kStreamBuilder = new KStreamBuilder();
KStream<String, String> stream = kStreamBuilder.stream("some-topic");
stream
.map((record) -> {
record.headers();
record.key();
record.value();
})
...
KStreamBuilder KStreamBuilder=new KStreamBuilder();
KStream stream=kStreamBuilder.stream(“某个主题”);
流动
.map((记录)->{
record.headers();
record.key();
record.value();
})
...
从2.0.0版开始,记录标题就可以访问(有关详细信息,请参阅)
您可以通过给定的“上下文”对象通过处理器API(即通过transform()
、transformValues()
、或process()
)访问记录元数据(参见)
更新
从2.7.0版本开始,处理器API得到了改进(参见),添加了一种新型的安全API。处理器类使用process(Record)
而不是process(K,V)
方法。对于这种情况,可以通过record
类)访问标题(和记录元数据)
这项新功能在DSL的“PAPI方法”(例如,KStream#process()
,KStream#transform()
和兄弟)中尚不可用
+++++
在2.0之前,上下文只公开主题、分区、偏移量和时间戳,而不公开在旧版本中实际上由流在读取时丢弃的头
虽然DSL级别没有元数据。但是,通过扩展DSL的工作也在进行中。澄清Matthias所说的:是的,Kafka Streams中的处理器API允许您访问记录元数据,如主题名、分区号、偏移量等。Kafka Streams中的DSL不允许您访问。但是,因为您可以结合处理器API和DSL,您仍然可以编写基于DSL的流处理应用程序,通过使用DSL的transform()
或transformValues()访问记录元数据
函数,它允许您从处理器API传入处理器/转换器。感谢各位提供的信息,我会留意元数据何时添加到DSL级别,以便更新此答案。@MatthiasJ.Sax和@MichaelG.Noll:in,对于RecordContext
提案,它似乎没有标题这是要添加的吗?没有计划通过KIP-159扩展{{{RecordContext}}当我们添加头支持时,这看起来是TDB,但我假设我们会向{{RecordContext}添加新方法对于这一点。如果您对细节感兴趣,Jira会做什么:)@MatthiasJ.Sax对我来说仍然不是100%清楚:这是否意味着通过Streams 1.0.1,既不能通过DSL也不能通过处理器API访问消息头?我通过检查ProcessorContext()来问,我无法找到当前处理的消息头。
KStreamBuilder kStreamBuilder = new KStreamBuilder();
KStream<String, String> stream = kStreamBuilder.stream("some-topic");
stream
.map((record) -> {
record.headers();
record.key();
record.value();
})
...