| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
package com.lisg.kafkatest; import java.util.Properties; import kafka.javaapi.producer.Producer;import kafka.producer.KeyedMessage;import kafka.producer.Partitioner;import kafka.producer.ProducerConfig;import kafka.serializer.StringEncoder; /** * Kafka生產者 * @author lisg * */public class KafkaProducer { public static void main(String[] args) { Properties props = new Properties(); //根據這個配置擷取metadata,不必是kafka叢集上的所有broker,但最好至少有兩個 props.put("metadata.broker.list", "vm1:9092,vm2:9092"); //訊息傳遞到broker時的序列化方式 props.put("serializer.class", StringEncoder.class.getName()); //zk叢集 props.put("zookeeper.connect", "vm1:2181"); //是否擷取反饋 //0是不擷取反饋(訊息有可能傳輸失敗) //1是擷取訊息傳遞給leader後反饋(其他副本有可能接受訊息失敗) //-1是所有in-sync replicas接受到訊息時的反饋 props.put("request.required.acks", "1");// props.put("partitioner.class", MyPartition.class.getName()); //建立Kafka的生產者, key是訊息的key的類型, value是訊息的類型 Producer<Integer, String> producer = new Producer<Integer, String>( new ProducerConfig(props)); int count = 0; while(true) { String message = "message-" + ++count; //訊息主題是test KeyedMessage<Integer, String> keyedMessage = new KeyedMessage<Integer, String>("test", message); //message可以帶key, 根據key來將訊息分配到指定區, 如果沒有key則隨機分配到某個區// KeyedMessage<Integer, String> keyedMessage = new KeyedMessage<Integer, String>("test", 1, message); producer.send(keyedMessage); System.out.println("send: " + message); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } // producer.close(); } } /** * 自訂分區類 * */class MyPartition implements Partitioner { public int partition(Object key, int numPartitions) { return key.hashCode()%numPartitions; } } |