我试图通过我的演员向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,它可以正常工作。
有什么想法吗?
答案 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,所以它抛出了强制转换异常。