44

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

codeforester
  • 39,467
  • 16
  • 112
  • 140
marathon
  • 7,881
  • 17
  • 74
  • 137
  • 4
    Also, the curator framework ships with a in memory zookeeper implementation for use in unit tests – manku Mar 15 '12 at 11:27
  • curator does ship with a testing zookeeper, but it is _not_ in memory. it stores data on disk, in a temp directory. – Martin Serrano Aug 13 '15 at 20:25

6 Answers6

61

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"));
bric3
  • 40,072
  • 9
  • 91
  • 111
gertas
  • 16,869
  • 1
  • 76
  • 58
48

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();
Mairbek Khadikov
  • 7,939
  • 3
  • 35
  • 51
12

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()

271828183
  • 599
  • 4
  • 7
4

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);
Community
  • 1
  • 1
itzg
  • 1,081
  • 2
  • 13
  • 11
  • You probably can't start zoo keeper server this way as it will block all subsequent code from executing after standaloneServerFactory.startup(server); – thomas.han May 18 '15 at 12:52
2
ServerConfig config = new ServerConfig();
config.parse(new String[] {port, dir});
ZooKeeperServerMain zk = new ZooKeeperServerMain();
zk.runFromConfig(config);
Niki Tonsky
  • 1,327
  • 11
  • 19
  • 2
    You can't run zookeeper server this way as it will block the following code i.e. code after zk.runFromConfig(config); from getting executed. – thomas.han May 18 '15 at 12:45
0

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();
8xomaster
  • 175
  • 11