package com.paypal.utils.cb.kafka; import java.io.IOException; import kafka.javaapi.producer.Producer; import kafka.producer.KeyedMessage; import kafka.producer.ProducerConfig; /** * CBKafkaProducer uses TAP Client to connect to Couchbase, * consume message and push to Kafka. * * @author ssudhakaran * */ public final class CBKafkaProducer { /** * @link http://kafka.apache.org/api-docs/0.6/kafka/producer/ProducerConfig.html */ private static ProducerConfig producerConfig; /** * @link http://people.apache.org/~joestein/kafka-0.7.1-incubating-docs/kafka/producer/Producer.html */ private static Producer<String, String> producer; private static void init(){ if(producerConfig==null) { producerConfig=new ProducerConfig(ConfigLoader.getKafkaConfigProps());} if(producer==null) { producer = new Producer<String, String>(producerConfig);} } /** * Check if we have a valid Kafka producer * @return */ public static boolean isValidProducer(){ if(producer !=null) return true; else { init(); if(producer !=null) return true; else return false; } } /** * Public Message to Kafka Queue * @param key - Key to Couchbase Document * @param msg - Body of Couchbase Document. * @throws IOException */ public static void publishMessage(final String key,final String message) throws IOException{ String msg=null; try { //If we need to make any Transformation on the message. if(Boolean.parseBoolean(ConfigLoader.getProp(Constants.ENABLETRANSFORMATION))){ msg = CBMessageTransformerFactory.INSTANCE.createCBMessageConverter().convert(key, message); }else{ msg=message; } } catch (Exception e) { //If any exception, perform no conversion } if(msg!=null && msg.trim().length()>0){ //Wrap KEY/VALUE in JSON -format {\"KEY\":\"<CBKEY>\",\"VALUE\":<CBVALUE>} String cbmessage=Constants.KAFKA_MESSAGE.replace("[CBKEY]", key); cbmessage=cbmessage.replace("[CBVALUE]", msg); KeyedMessage<String, String> data = new KeyedMessage<String, String>(ConfigLoader.getKafkaConfigProps().getProperty(Constants.TOPIC_NAME), key, cbmessage); //property producer.type indicates async/sync message if(data!=null) producer.send(data); } } /** * close producer */ public static void closeProducer(){ producer.close(); } }