Как реализовать приложение 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

2022-10-09T21:52:15+00:00
Вопросы с похожей тематикой, как у вопроса:

Как реализовать приложение Java с одним экземпляром?