Is it possible to start a zookeeper server instance in process, say for unit tests?

后端 未结 6 1081
难免孤独
难免孤独 2020-11-30 22:04

Calling org.apache.zookeeper.server.quorum.QuorumPeerMain.main() isn\'t working.

相关标签:
6条回答
  • 2020-11-30 22:31
    ServerConfig config = new ServerConfig();
    config.parse(new String[] {port, dir});
    ZooKeeperServerMain zk = new ZooKeeperServerMain();
    zk.runFromConfig(config);
    
    0 讨论(0)
  • 2020-11-30 22:37

    To start ZooKeeper you have to execute ZooKeeperServerMain class.

    You can use following code to start ZooKeeper in embedded mode.

    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();
    
    0 讨论(0)
  • 2020-11-30 22:42

    You can use something like this.

    int clientPort = 21818; // none-standard
    int numConnections = 5000;
    int tickTime = 2000;
    String 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.
    

    And to shut it down just call standaloneServerFactory.shutdown()

    0 讨论(0)
  • 2020-11-30 22:43

    Netfix opensourced Curator a framework to make use of Zookeeper even more convenient. It has build in test server class. Just add this test dependency to your project descriptor be it maven, gradle or else:

    org.apache.curator:curator-framework:4.0.1
    org.apache.curator:curator-test:4.0.1
    

    And here are the test essentials.

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

    With cli creating any test data is very easy (requires the curator-framework dependency).

    cli.create()
       .creatingParentsIfNeeded()
       .forPath("/a1", "testvalue".getBytes("UTF-8"));
    
    0 讨论(0)
  • 2020-11-30 22:46

    An updated version of GeoffBourne's answer.

        int clientPort = 2199; // not standard
        int numConnections = 5000;
        int tickTime = 2000;
        String 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();
    
    0 讨论(0)
  • 2020-11-30 22:47

    Building on 1's answer by adding the use of an ephemeral port (shown by zkPort) and updated for latest ZK API:

    int tickTime = 2000;
    int numConnections = 5000;
    String 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);
    
    0 讨论(0)
提交回复
热议问题