package com.pqs9900.util.Kafka;

import com.pqs9900.controller.webtool.CsvDataController;
import kafka.javaapi.producer.Producer;
import kafka.producer.KeyedMessage;
import kafka.producer.ProducerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Properties;
import java.util.concurrent.TimeUnit;


public class JavaKafkaProducer extends Thread{

	private static final Logger logger = LoggerFactory.getLogger(JavaKafkaProducer.class);
	private Producer<String, String> producer =null;
	
	private String topic_name,message;
    /**
     * 构造函数
     *
     * @param brokerList  192.168.1.12:9092
     */
    public JavaKafkaProducer(String brokerList,String byteLeangh,String topic_name,String message) {
    	
    	 this.topic_name = topic_name;
    	 this.message = message;
    	
    	 Properties props = new Properties();
    	 props.put("metadata.broker.list", brokerList);
	    /**
	     * 0表示不等待结果返回<br/>
	     * 1表示等待至少有一个服务器返回数据接收标识<br/>
	     * -1表示必须接收到所有的服务器返回标识，及同步写入<br/>
	     * 
	     * */
	    props.put("request.required.acks", "1");
	    /**
	     * 内部发送数据是异步还是同步
	     * sync：同步, 默认
	     * async：异步
	     */
	    props.put("producer.type", "async");
	    /**
	     * 设置序列化的类
	     * 可选：kafka.serializer.StringEncoder
	     * 默认：kafka.serializer.DefaultEncoder
	     */
	    props.put("serializer.class", "kafka.serializer.StringEncoder");
//	    /**
//	     * 设置分区类
//	     * 根据key进行数据分区
//	     * 默认是：kafka.producer.DefaultPartitioner ==> 安装key的hash进行分区
//	     * 可选:kafka.serializer.ByteArrayPartitioner ==> 转换为字节数组后进行hash分区
//	     */
//	    props.put("partitioner.class", "JavaKafkaProducerPartitioner");
//
//	    // 重试次数
//	    props.put("message.send.max.retries", "3");
//
//	    // 异步提交的时候(async)，并发提交的记录数
//	    props.put("batch.num.messages", "200");

	    // 设置缓冲区大小，默认10KB
//	    props.put("send.buffer.bytes", byteLeangh);

	    // 2. 构建Kafka Producer Configuration上下文
	    ProducerConfig  config = new ProducerConfig(props);
	    
	    // 3. 构建Producer对象
	    producer = new Producer<String, String>(config);
 	    
    }

	public void run() {
    	if(producer !=null){
    			 // 发送数据
            	KeyedMessage<String, String> keyedMessage = new KeyedMessage<String, String>(topic_name, message);
                producer.send(keyedMessage);
                try {
                    TimeUnit.SECONDS.sleep(1000);  
                } catch (InterruptedException e) {  
                    logger.error("产生了异常，异常是"+e.getMessage());
                }  
    	}
    }
}
