Принудительно завершить установку, когда порты недоступны?

Я использую install4j для установки приложения интрасети, для которого требуется порт HTTP и HTTPS. Я хотел бы проверить, доступны ли эти порты, и предупредить пользователя/заблокировать установку, пока они не выберут недоступные порты.

Единственный способ, который я вижу для этого (помимо пользовательского кода), - обеспечить сбой службы Windows, если приложение не может привязаться к нужным портам, и использовать стратегию отказа «Спросить пользователя, следует ли повторить попытку или выйти в случае сбоя». В коде запуска веб-сервера я использую System.exit(1), если сервер не может выполнить привязку к портам. Однако это не регистрируется установщиком как сбой — установка продолжается без вызова стратегии сбоя.

Как правильно сигнализировать об отказе действия «Запустить службу»? Использовали ли другие люди альтернативный подход к гарантии использования доступных портов при установке?


person Adam Rabung    schedule 18.07.2012    source источник


Ответы (2)


С тех пор я нашел хороший альтернативный подход: добавьте пользовательское действие кода:

List<Integer> takenPorts = new ArrayList<Integer>();
for (int port : Arrays.asList(80, 443)) {
    java.net.ServerSocket socket = null;
    try {
        socket = new java.net.ServerSocket(port);
    } catch (IOException e) {
        takenPorts.add(port);
    } finally { 
        if (socket != null) socket.close(); 
    }
}

if (takenPorts.isEmpty()) {
     return true;
}
else {
    String msg;
    if (takenPorts.size() == 2) {
        msg = "Ports 80 and 443 must be available for uDiscovery";
    }
    else {
        msg = "Port " + takenPorts.get(0) + " must be available for uDiscovery";
    }
    context.setVariable("portErrorMessage", msg);
    return false;
}

Хорошее объяснение того, как подключить это здесь

person Adam Rabung    schedule 18.07.2012
comment
Для большей гибкости вы также можете отображать сообщения об ошибках с помощью Util.showMessage(msg, JOptionPane.ERROR_MESSAGE); непосредственно в сценарии вместо использования стратегии отказа действия. - person Ingo Kegel; 19.07.2012
comment
Хм, это дает мне просто кнопку ОК, но с поведением Игнорировать - person Adam Rabung; 19.07.2012
comment
Вы можете заключить этот код в цикл и использовать Util.showOptionDialog(msg, new String[] {"Retry", "Quit}, JOptionPane.ERROR_MESSAGE), и если результат равен 1, вы возвращаете false. Затем вы можете установить стратегию отказа действия «Выход при сбое». - person Ingo Kegel; 19.07.2012
comment
В итоге мне понадобился другой рабочий процесс, поэтому я использовал выражение проверки формы - отлично сработало. Фантастический продукт, спасибо за вашу помощь. - person Adam Rabung; 19.07.2012

Все, кто только что получил диалоговое окно с сообщением об ошибке

"Ошибка com.install4j.runtime.beans.action.control.RunScriptAction"

Я думаю, что это тоже было то, что Адам получил:

В приведенном выше сценарии была установлена ​​переменная с именем portErrorMessage.

Я тоже сначала не понял. Хитрость довольно проста: вам нужно вставить ${installer:portErrorMessage} в поле «Сообщение об ошибке». При этом вам не нужен Util.showOptionDialog, описанный Инго, так как вызов этого метода открывает другое, второе диалоговое окно, которое должно быть подтверждено первым, после чего пользователь также должен будет подтвердить диалог из install4j.

person Kai Frogger    schedule 05.10.2015