平台:IDEA2016 ---语言:java ---代码链接:https://pan.baidu.com/s/1pKPPk5X
javaAPI操作kafka,主要的难点在于消费者的书写,个人感受就是网上查代码,然后敲进去,看到缺什么就看源码,根据源码学。附上主要类及其方法注释。
类kafkaProperties主要书写配置信息,如broken和zookeeper的地址等。
public class kafkaProperties {
//zookeeper的地址
public static final String ZK = "10.23.15.39:2181";
//创建topic
public static final String TOPIC = "hello_topic";
//broker的地址
public static final String BROKER_LIST="10.23.15.39:9092";
//自定义group_id
public static final String GROUP_ID = "test_group1";
}
类KafkaProduce为kafka的生产者
public class KafkaProduce extends Thread{
private String topic ;
//kafka发生产者类
private Producer producer;
public KafkaProduce(String topic){
this.topic = topic;
Properties properties = new Properties();
//这些属性都是从ProducerConfig 及其父类 AsyncProducerConfig with SyncProducerConfigShared 查询到的
properties.put("metadata.broker.list",kafkaProperties.BROKER_LIST);
properties.put("serializer.class","kafka.serializer.StringEncoder");
properties.put("request.required.acks","1");
producer = new Producer(new ProducerConfig(properties));
}
//重写run方法让生产者一直发
@Override
public void run() {
int messageNo = 1;
while(true) {
String message = "message_" + messageNo;
producer.send(new KeyedMessage(topic, message));
System.out.println("Sent: " + message);
messageNo ++ ;
try{
Thread.sleep(2000);
} catch (Exception e){
e.printStackTrace();
}
}
}
}
类kafkaConsumer为kafka的消费者
public class kafkaConsumer extends Thread {
private String topic;
public kafkaConsumer(String topic) {
this.topic = topic;
}
//创建consumer连接
private ConsumerConnector createConnector(){
Properties properties = new Properties();
properties.put("zookeeper.connect", kafkaProperties.ZK);
properties.put("group.id",kafkaProperties.GROUP_ID);
//不知道输入什么参数,就进源码中查看
return Consumer.createJavaConsumerConnector(new ConsumerConfig(properties));
}
@Override
public void run() {
//获得消费者对象
ConsumerConnector consumer = createConnector();
Map topicCountMap = new HashMap();
//消费者可以区分topic
topicCountMap.put(topic,1);
// topicCountMap.put(topic3, 1);
// String: topic
// List> 对应的数据流
Map>> messageStreams = consumer.createMessageStreams(topicCountMap);
//获取指定的topic中的第一个
KafkaStream stream = messageStreams.get(topic).get(0);
ConsumerIterator iterator = stream.iterator();
while (iterator.hasNext()){
String message = new String(iterator.next().message());
System.out.println("rec: "+message);
}
}
}
类KafkaClientApp作为项目的启动类
public static void main(String[] args) {
new KafkaProduce(kafkaProperties.TOPIC).start();
new kafkaConsumer(kafkaProperties.TOPIC).start();
}