package com.neverwinterdp.kafka.tool.server; import java.io.File; import java.util.Properties; import kafka.server.KafkaConfig; import kafka.server.KafkaServer; import kafka.utils.Time; import com.neverwinterdp.tool.server.Server; import com.neverwinterdp.util.JSONSerializer; /** * @author Tuan Nguyen * @email tuan08@gmail.com */ public class EmbededKafkaServer implements Server { private KafkaServer server; ThreadGroup kafkaGroup; int kafkaGroupTracker = 1; private Properties properties = new Properties(); private Thread thread; private boolean verbose = true; public EmbededKafkaServer(int id, String dataDir, int port) { properties.put("host.name", "127.0.0.1"); properties.put("advertised.host.name", "127.0.0.1"); properties.put("port", "9092"); properties.put("broker.id", "1"); properties.put("auto.create.topics.enable", "true"); properties.put("log.dirs", "./build/data/kafka"); properties.put("zookeeper.connect", "127.0.0.1:2181"); properties.put("default.replication.factor", "1"); //enable topic deletion properties.put("delete.topic.enable", "true"); properties.put("controlled.shutdown.enable", "true"); properties.put("auto.leader.rebalance.enable", "true"); properties.put("controller.socket.timeout.ms", "30000"); properties.put("controlled.shutdown.enable", "true"); properties.put("controlled.shutdown.max.retries", "3"); properties.put("controlled.shutdown.retry.backoff.ms", "5000"); properties.put("zookeeper.session.timeout.ms", "15000"); properties.put("broker.id", Integer.toString(id)); properties.put("port", Integer.toString(port)); properties.put("log.dirs", dataDir); } public EmbededKafkaServer setVerbose(boolean b) { verbose = b ; return this; } public EmbededKafkaServer setReplication(int replication) { properties.put("default.replication.factor", Integer.toString(replication)); return this; } public EmbededKafkaServer setZkConnect(String zkConnect) { properties.put("zookeeper.connect", zkConnect); return this; } public EmbededKafkaServer setNumOfPartition(int number) { properties.put("num.partitions", Integer.toString(number)); return this; } public void start() throws Exception { kafkaGroup = new ThreadGroup("Kafka-" + properties.getProperty("broker.id") + "-" + ++kafkaGroupTracker); String logDir = properties.getProperty("log.dirs"); logDir = logDir.replace("/", File.separator); properties.setProperty("log.dirs", logDir); if(verbose) { System.out.println("kafka properties:\n" + JSONSerializer.INSTANCE.toString(properties)); } thread = new Thread(kafkaGroup, "KafkaLauncher") { public void run() { server = new KafkaServer(new KafkaConfig(properties), new SystemTime()); server.startup(); } }; thread.start(); // Wait to make sure the server is launched Thread.sleep(2000); } @Override public void shutdown() { if (server == null) return; long startTime = System.currentTimeMillis(); // server.awaitShutdown(); // server.socketServer().shutdown(); // server.kafkaController().shutdown(); // server.kafkaScheduler().shutdown(); // server.replicaManager().shutdown() ; // kafkaGroup.interrupt() ; server.shutdown(); // server.kafkaController().shutdown(); // server.replicaManager().replicaFetcherManager().closeAllFetchers(); // server.kafkaScheduler().shutdown(); // server.logManager().shutdown(); kafkaGroup.interrupt(); kafkaGroup = null; server = null; System.out.println("KafkaThreadKiller thread shutdown kafka successfully in " + (System.currentTimeMillis() - startTime) + "ms"); } static public class SystemTime implements Time { public long milliseconds() { return System.currentTimeMillis(); } public long nanoseconds() { return System.nanoTime(); } public void sleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException e) { } } } @Override public String getHost() { return server.config().advertisedHostName(); } @Override public int getPort() { return server.config().advertisedPort(); } @Override public String getConnectString() { return getHost() + ":" + getPort() ; } }