package com.neverwinterdp.kafka.producer;
import java.nio.charset.Charset;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.kafka.clients.producer.Callback;
import com.neverwinterdp.util.JSONSerializer;
/**
* @author Tuan Nguyen
* @email tuan08@gmail.com
*/
abstract public class AbstractKafkaWriter implements KafkaWriter {
final static public Charset UTF8 = Charset.forName("UTF-8") ;
private String name;
private AtomicLong idTracker = new AtomicLong();
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public AbstractKafkaWriter(String name) {
this.name = name;
}
@Override
public void send(String topic, String data, long timeout) throws Exception {
send(topic, nextKey(-1), data, timeout);
}
@Override
public void send(String topic, String key, String data, long timeout) throws Exception {
send(topic, -1, key, data, null, timeout);
}
@Override
public void send(String topic, int partition, String key, String data, long timeout) throws Exception {
send(topic, partition, key, data, null, timeout);
}
@Override
public <T> void send(String topic, T obj, long timeout) throws Exception {
send(topic, -1, nextKey(-1), JSONSerializer.INSTANCE.toString(obj), null, timeout);
}
public void send(String topic, int partition, String key, String data, Callback callback, long timeout) throws Exception {
byte[] keyBytes = key.getBytes(UTF8);
byte[] messageBytes = data.getBytes(UTF8);
send(topic, partition, keyBytes, messageBytes, callback, timeout);
}
private String nextKey(int partition) {
if(partition >= 0) {
return "p:" + partition + ":" + idTracker.incrementAndGet();
} else {
return Long.toString(idTracker.incrementAndGet());
}
}
}