Est-il possible de démarrer une instance de serveur zookeeper en cours, par exemple pour les tests unitaires?

L’appel de org.apache.zookeeper.server.quorum.QuorumPeerMain.main () ne fonctionne pas.

Pour démarrer ZooKeeper vous devez exécuter la classe ZooKeeperServerMain .

Vous pouvez utiliser le code suivant pour démarrer ZooKeeper en mode intégré.

 Properties startupProperties = ... QuorumPeerConfig quorumConfiguration = new QuorumPeerConfig(); try { quorumConfiguration.parseProperties(startupProperties); } catch(Exception e) { throw new RuntimeException(e); } zooKeeperServer = new ZooKeeperServerMain(); final ServerConfig configuration = new ServerConfig(); configuration.readFrom(quorumConfiguration); new Thread() { public void run() { try { zooKeeperServer.runFromConfig(configuration); } catch (IOException e) { log.error("ZooKeeper Failed", e); } } }.start(); 

Netfix opensourced Curator est un framework pour rendre Zookeeper encore plus pratique. Il a intégré la classe du serveur de test. Si vous utilisez Maven, ajoutez ceci à votre projet pom.xml :

  org.apache.curator curator-test 2.2.0-incubating test  

Et voici l’essentiel du test.

 TestingServer zkTestServer; @Before public void startZookeeper() throws Exception { zkTestServer = new TestingServer(2181); cli = CuratorFrameworkFactory.newClient(zkTestServer.getConnectSsortingng(), new RetryOneTime(2000)); } @After public void stopZookeeper() throws IOException { cli.close(); zkTestServer.stop(); } 

Avec cli créer des données de test est très facile.

 cli.create().forPath("/a1", "testvalue".getBytes()); 

Vous pouvez utiliser quelque chose comme ça.

 int clientPort = 21818; // none-standard int numConnections = 5000; int tickTime = 2000; Ssortingng dataDirectory = System.getProperty("java.io.tmpdir"); File dir = new File(dataDirectory, "zookeeper").getAbsoluteFile(); ZooKeeperServer server = new ZooKeeperServer(dir, dir, tickTime); NIOServerCnxn.Factory standaloneServerFactory = new NIOServerCnxn.Factory(new InetSocketAddress(clientPort), numConnections); standaloneServerFactory.startup(server); // start the server. 

Et pour le fermer, appelez simplement standaloneServerFactory.shutdown()

Construire sur la réponse de 1 en ajoutant l’utilisation d’un port éphémère (montré par zkPort ) et mis à jour pour la dernière API ZK:

 int tickTime = 2000; int numConnections = 5000; Ssortingng dataDirectory = System.getProperty("java.io.tmpdir"); File dir = new File(dataDirectory, "zookeeper").getAbsoluteFile(); ZooKeeperServer server = new ZooKeeperServer(dir, dir, tickTime); standaloneServerFactory = ServerCnxnFactory.createFactory(0, numConnections); int zkPort = standaloneServerFactory.getLocalPort(); standaloneServerFactory.startup(server); 
 ServerConfig config = new ServerConfig(); config.parse(new Ssortingng[] {port, dir}); ZooKeeperServerMain zk = new ZooKeeperServerMain(); zk.runFromConfig(config); 

Une version mise à jour de la réponse de GeoffBourne.

  int clientPort = 2199; // not standard int numConnections = 5000; int tickTime = 2000; Ssortingng dataDirectory = System.getProperty("java.io.tmpdir"); File dir = new File(dataDirectory, "zookeeper").getAbsoluteFile(); ZooKeeperServer server = new ZooKeeperServer(dir, dir, tickTime); ServerCnxnFactory factory = new NIOServerCnxnFactory(); factory.configure(new InetSocketAddress(clientPort), numConnections); factory.startup(server); // start the server. // ...shutdown some time later factory.shutdown();