通过Kafka发布和使用Scala/Java案例类

通过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

使用Scala(或Java)通过Kafka发布和使用案例类的好方法是什么

我在这里找到了各种部分示例,包括答案,但没有完整的示例

我使用自定义卡夫卡序列化成功地实现了这一点,如下所示,但我想了解是否有更好的方法来实现这一点:

泛型序列化程序类:

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()
    }
}