Как дождаться запуска другого приложения (eXist-db) (используя java), прежде чем взаимодействовать с ним? - PullRequest
0 голосов
/ 29 апреля 2018

В настоящее время я работаю с eXist-db, и я хочу выполнить сценарий командной строки, чтобы запустить eXist-db (/bin/startup.sh), дождаться его создания базы данных, чтобы я мог получить коллекцию из него.

    //start database
    try {
        Runtime.getRuntime().exec(path + start);
    } catch (IOException ex) {
        return false;
    }
    //get collection
    col = DatabaseManager.getCollection(URI + "/db", username, password);

Я хочу подождать с getCollection, пока база данных не будет создана (может быть вызвана), или после определенного количества времени ожидания, если база данных не инициализируется, я хотел бы ее убить (скажем, максимум одна минута). Как лучше всего решить эту проблему? Используя сон / ожидание несколько раз и пытаясь вызвать базу данных? Как то так?

    Process pr = null;
    try {
        pr = Runtime.getRuntime().exec(path + start);
    } catch (IOException ex) {
        return false;
    }

    for (int i = 0; i < 60; i++) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException ex) {
            pr.destroy();
            return false;
        }
        try {
            dbDetected = initCollection();
        } catch (XMLDBException ex) {
            if (ex.errorCode != ErrorCodes.VENDOR_ERROR  ||
                    "Failed to read server's response: Connection refused (Connection refused))"
                            .compareTo(ex.getMessage()) != 0 ) {
                pr.destroy();
                return false;
            }
        }

А что касается уничтожения части, я хотел бы подтвердить предположение, что достаточно сохранить процесс и уничтожить его с помощью функции Process.destroy() (основываясь на предположении, что сценарий для базы данных занимает слишком много времени в обычном режиме выполнения, в конце моего приложения я бы использовал предоставленный скрипт eXist-db /bin/shutdown.sh).

1 Ответ

0 голосов
/ 01 мая 2018

Вместо того, чтобы использовать startup.sh, если вы работаете во встроенном режиме, вы можете использовать вместо этого из тестового пакета класс ExistEmbeddedServer (или он может называться EmbeddedExistServer, извините, я не на своем компьютере в течение нескольких дней).

Я не думаю, что вы можете использовать startup.sh напрямую для ваших целей, так как он создает приоритетный процесс. Вместо этого вы должны запустить eXist из вашего Java-приложения, как описано выше.

...