web-dev-qa-db-ja.com

ユニットテストなどで、進行中のzookeeperサーバーインスタンスを起動することは可能ですか?

Org.Apache.zookeeper.server.quorum.QuorumPeerMain.main()の呼び出しが機能していません。

44
marathon

ZooKeeperを開始するには、ZooKeeperServerMainクラスを実行する必要があります。

次のコードを使用して、ZooKeeperを埋め込みモードで開始できます。

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

Netfix opensourced Curator Zookeeperをさらに便利に使用するためのフレームワーク。テストサーバークラスが組み込まれています。このtest依存関係をプロジェクト記述子に追加するだけです(maven、gradleなど)。

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

そして、ここにテストの要点があります。

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

cliを使用すると、テストデータを簡単に作成できます(curator-framework依存関係)。

cli.create()
   .creatingParentsIfNeeded()
   .forPath("/a1", "testvalue".getBytes("UTF-8"));
60
gertas

このようなものを使用できます。

_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.
_

シャットダウンするにはstandaloneServerFactory.shutdown()を呼び出すだけです

12
271828183

一時ポート(zkPortで表示)の使用を追加して 1 の答えを基に構築し、最新の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);
3
itzg
ServerConfig config = new ServerConfig();
config.parse(new String[] {port, dir});
ZooKeeperServerMain zk = new ZooKeeperServerMain();
zk.runFromConfig(config);
2
Nikita Prokopov

GeoffBourneの回答の更新バージョン。

    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
8xomaster