Как реализовать приложение Java с одним экземпляром?
Если я в это верю article, автор:
попытка java первого экземпляра открыть oraclejdk прослушивающий сокет на интерфейсе oraclejdk localhost. Если он может single-instance открыть сокет, предполагается, что core-java это первый запущенный экземпляр java-se приложения. Если нет, предполагается, что java-libraries экземпляр этого приложения core-java уже запущен. Новый экземпляр single-instance должен уведомить существующий jre экземпляр о попытке запуска, а java-api затем выйти. Существующий jre экземпляр вступает во владение core-java после получения уведомления javax и запускает событие для прослушивателя, который java-libraries обрабатывает действие.
Примечание: Ahe упоминает javax в комментарии, что использование java-se InetAddress.getLocalHost()
может быть сложным:
- он не работает должным образом в DHCP-среде, поскольку возвращаемый адрес зависит от того, имеет ли компьютер доступ к сети.
Решение состояло в том, чтобы открыть соединение сInetAddress.getByAddress(new byte[] {127, 0, 0, 1})
;
Вероятно, связано с bug 4435662.
- Я также нашел bug 4665037, который сообщает, чем Ожидаемые результаты
getLocalHost
: возврат IP-адреса машины по сравнению с фактическими результатами: возврат127.0.0.1
.
удивительно, что single-instance
getLocalHost
возвращает127.0.0.1
в Linux, но core-java не в Windows.
Или вы можете singleinstance использовать объект ManagementFactory
. Как java-se объяснил here:
Метод
getMonitoredVMs(int processPid)
получает core-java в качестве параметра текущий java-libraries PID приложения и перехватывает j2se имя приложения, которое вызывается core-java из командной строки, например, приложение java-libraries было запущено с путиc:\java\app\test.jar
, тогда j2se значение переменной равно java-api «c:\\java\\app\\test.jar
». Таким образом, мы поймаем javax только имя приложения в строке j2se 17 кода ниже.
После этого j2se ищем в JVM другой процесс oraclejdk с таким же именем, если мы jre его нашли и PID приложения .java другой, значит это второй j2se экземпляр приложения.
JNLP openjdk также предлагает SingleInstanceListener
java
single-instance
Как реализовать приложение Java с одним экземпляром?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.