Kafka Producer的java客户端示例,send方法不接受KeyedMessage

时间:2015-03-23 10:39:27

标签: java apache-kafka

我正在运行kafka 2.9.1-0.8.2.1。我在主kafka目录中包含了libs /目录中提供的jar。现在我正在尝试按照https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+Producer+Example给出的内容运行java生成器示例。现在producer.send方法似乎接受了这种论证Seq<KeyedMessage<String, String>>。在该示例中,KeyedMessage的对象不会转换为任何内容。当我尝试做同样的事情时,我得到了不兼容的类型编译器错误。

这是代码

import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
import java.util.Properties;
import kafka.producer.Producer;
import scala.collection.Seq;

public class KakfaProducer {
  public static void main(String [] args) {
    Properties prop = new Properties();
    prop.put("metadata.broker.list", "localhost:9092");
    prop.put("serializer.class","kafka.serializer.StringEncoder");
    //prop.put("partitioner.class", "example.producer.SimplePartitioner");
    ProducerConfig producerConfig = new ProducerConfig(prop);
    Producer<String,String> producer = new <String,String>Producer(producerConfig);
    String topic = "test";
    KeyedMessage<String,String> message = new <String,String>KeyedMessage(topic, "Hello Test message");
    producer.send(message);
    producer.close();
  }
}

这个注释代码给了我类def def not found异常。我试图在网上看很多,但它没有帮助。

libs /目录中有两种jar。一个是kafka-client,另一个是kafka和版本号。我包括错误的罐子吗?我需要使用哪一个?

2 个答案:

答案 0 :(得分:8)

对于第一个问题,不是导入scala API,而是导入Java。 所以,而不是使用:

import kafka.producer.Producer;

请使用:

import kafka.javaapi.producer.Producer;

SimplePartitioner代码可以在下面找到。将其添加到相应的目录:

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

public class SimplePartitioner implements Partitioner {
    public SimplePartitioner (VerifiableProperties props) {
    }

    public int partition(Object key, int numPartitions) {
        int partition = 0;
        String stringKey = (String) key;
        int offset = stringKey.lastIndexOf('.');
        if (offset > 0) {
           partition = Integer.parseInt( stringKey.substring(offset+1)) % numPartitions;
        }
       return partition;
  }
}

答案 1 :(得分:2)

有两种方法可以在Java中运行生产者。

1)使用核心Kafka。它是你的方法。 2)使用Kafka-client。

Kafka 0.8.2 Documentation中提到了这些差异。

  

这些新客户端旨在取代现有的Scala客户端,但为了兼容性,它们将共存一段时间。这些客户端在具有最小依赖性的单独jar中可用,而旧的Scala客户端仍与服务器打包在一起。

这意味着新客户端较小,可能会替换原始方法。

在第3.4节中。新制作人提供了一些不同的配置。

  

我们正在努力替换现有的制作人。该代码现在可以在trunk中使用,可以被认为是beta质量。