通过Kafka发布和使用Scala/Java案例类
使用Scala(或Java)通过Kafka发布和使用案例类的好方法是什么 我在这里找到了各种部分示例,包括答案,但没有完整的示例 我使用自定义卡夫卡序列化成功地实现了这一点,如下所示,但我想了解是否有更好的方法来实现这一点: 泛型序列化程序类:通过Kafka发布和使用Scala/Java案例类,java,scala,apache-kafka,case-class,Java,Scala,Apache Kafka,Case Class,使用Scala(或Java)通过Kafka发布和使用案例类的好方法是什么 我在这里找到了各种部分示例,包括答案,但没有完整的示例 我使用自定义卡夫卡序列化成功地实现了这一点,如下所示,但我想了解是否有更好的方法来实现这一点: 泛型序列化程序类: package mypackage import java.nio.charset.Charset import java.util import org.apache.kafka.common.errors.SerializationExcepti
package mypackage
import java.nio.charset.Charset
import java.util
import org.apache.kafka.common.errors.SerializationException
import org.apache.kafka.common.serialization.Serializer
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization
class ObjectSerializer[T <: AnyRef] extends Serializer[T] {
override def configure(config: util.Map[String, _], isKey: Boolean): Unit = {
}
override def serialize(topic: String, data: T): Array[Byte] = {
if (data == null) {
return Array.empty[Byte]
} else {
try {
implicit val formats = DefaultFormats
val json = Serialization.write[T](data)
val bytes = json.getBytes(Charset.forName("utf-8"))
return bytes
} catch {
case ex: Exception =>
throw new SerializationException(ex)
}
}
}
override def close(): Unit = {
}
}
package mypackage
import payoneer.labs.techExamples.dataModel.MyDataA
class MyDataADeserializer extends ObjectDeserializer[MyDataA](classOf[MyDataA]) {
}
配置:
ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, classOf[StringSerializer]
ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, classOf[ObjectSerializer[MyDataA]]
ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, classOf[StringDeserializer]
ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, classOf[MyDataADeserializer]
然后使用KafkaProducer[String,MyDataA]
和KafkaConsumer[String,MyDataA]
,假设我要使用的键是String
,我要使用的值是MyDataA
然后,我可以使用以下方法进行发布:
producer.send(new ProducerRecord[String, MyDataA](topic, key, value))
并使用:
while (true) {
val messages = consumer.poll(1000).iterator().asScala
for (msg <- messages) {
val key : String = msg.key()
val value : MyDataA = msg.value()
}
}
while(true){
val messages=consumer.poll(1000).iterator().asScala
对于(msg根据我的卡夫卡经历,我可以建议您使用Reactor Kafka()。它还有一个非常好的文档()我在这里看不到任何关于发布和使用自定义类型的内容。在这里你可以找到一些示例。同样在参考手册中,看看2.4.1点仍然不相关AVRO4S有一个GenericSerde,它应该适用于Scala案例类,但我一直无法在运行时使用它-它可以编译。你发现的大多数示例都使用t他为String、Int或Long内置了Serdes,这有点令人沮丧!@ChrisW使用自定义序列化器/反序列化器与JSON进行转换非常容易,当时我很困惑为什么客户端没有包含这样一对基本的类。
while (true) {
val messages = consumer.poll(1000).iterator().asScala
for (msg <- messages) {
val key : String = msg.key()
val value : MyDataA = msg.value()
}
}