kafkaproducer,适用于键控和非键控产品记录

fv2wmkja  于 2021-06-07  发布在  Kafka
关注(0)|答案(1)|浏览(326)

我正在scala中使用0.9KafkaJava客户机。

scala> val kafkaProducer = new KafkaProducer[String, String](props)
``` `ProducerRecord` 具有多个构造函数,允许您包含或不包含键和/或分区。

scala> val keyedRecord = new ProducerRecord("topic", "key", "value")
scala> kafkaProducer.send(keyedRecord)

应该没问题。
然而,一个无知的人 `ProducerRecord` 给出类型错误。

scala> val unkeyedRecord = new ProducerRecord("topic", "value")
res8: org.apache.kafka.clients.producer.ProducerRecord[Nothing,String] =
ProducerRecord(topic=topic, partition=null, key=null, value=value

scala> kafkaProducer.send(res8)
:17: error: type mismatch;
found : org.apache.kafka.clients.producer.ProducerRecord[Nothing,String]
required: org.apache.kafka.clients.producer.ProducerRecord[String,String]
Note: Nothing <: String, but Java-defined class ProducerRecord is invariant in type K.
You may wish to investigate a wildcard type such as _ <: String. (SLS 3.2.10)
kafkaProducer.send(res8)
^

这是违反Kafka的规则,还是因为在scala中使用javaapi而产生的不必要的预防措施?
更重要的是,把关键的和不关键的信息放在同一个Kafka主题中是不是形式很差?
谢谢您
javadoc公司:http://kafka.apache.org/090/javadoc/org/apache/kafka/clients/producer/package-summary.html
编辑
可以改变参数的方差 `K` 在 `KafkaProducer` 修好这个?
mzmfm0qo

mzmfm0qo1#

答案似乎在注解中,但要说清楚,scala在没有显式提供类型时使用类型推断。既然你写了:

val unkeyedRecord = new ProducerRecord("topic", "value")

没有提供键,它将变为null,scala的类型系统推断这是一个nothing示例。要解决此问题,请显式声明类型:

val unkeyedRecord = new ProducerRecord[String,String]("topic", "value")

相关问题