scala + kafka不发送带有id的消息

时间:2015-05-28 23:16:31

标签: scala akka apache-kafka

我试图通过我的演员向Kafka发送消息,但这不起作用。

以下代码可以使用

new KeyedMessage[String, Array[Byte]]("my-topic", msg.message)

这个没有......为什么?

new KeyedMessage[String, Array[Byte]]("my-topic", msg.id, msg.message)

甚至

new KeyedMessage[String, Array[Byte]]("my-topic", msg.id, null, msg.message)

将分区设置为null,强制它仅填充id,但仍然相同。

有什么想法吗?

修改

嗯,只是意识到将消息作为字节数组发送时不起作用。

我已将我的代码更改为允许以字符串形式发送消息,但它可以正常工作。

以下内容不起作用:

  props.put("serializer.class", "kafka.serializer.DefaultEncoder")

  override def receive: Receive = {
    case msg: Message =>
      val keyedMessage = new KeyedMessage[String, Array[Byte]]("my-topic", msg.id, msg.message)
      producer.send(keyedMessage)

    case _ => log.error("Got a msg that I don't understand")
  }

将Array [Byte]修改为String,将DefaultEncoder修改为StringEncoder,它可以正常工作。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

好吧,我刚刚发现了问题。

实际上,Encoder有两种选择。 DefaultEncoder和StringEncoder。我试图使用默认编码器将我的id发送为String并将消息作为字节数组发送。

查看Encoder.scala,您可以看到DefaultEncoder实现和答案。

/**
 * The default implementation is a no-op, it just returns the same array it takes in
 */
class DefaultEncoder(props: VerifiableProperties = null) extends Encoder[Array[Byte]] {
  override def toBytes(value: Array[Byte]): Array[Byte] = value
}

它只返回字节数组,因为我传递了一个String,所以它抛出了强制转换异常。