Использование пустого файла для одного экземпляра приложения - PullRequest
2 голосов
/ 29 июля 2010

Возможно, есть другие способы сделать это, но я бы хотел использовать пустой файл, чтобы один экземпляр приложения работал в данный момент времени. Это можно сделать, создав файл при запуске приложения и завершив работу других экземпляров приложения, как только он обнаружит файл.

Проблема с этим подходом состоит в том, что файл может остаться, если приложение неожиданно останавливается и ShutDownhook оказывается ненадежным.

Как бы вы поступили так, как задумано?

Ответы [ 6 ]

2 голосов
/ 29 июля 2010

Привязать к порту с высоким номером, но не слушать. Две программы не могут привязаться к одному и тому же TCP-порту на одном компьютере. Очень кроссплатформенный, но все же чем-то похожий на кучу.

1 голос
/ 29 июля 2010

Вероятно, есть лучший способ сделать это, чем использовать файл, но при таком подходе вы можете записать временную метку в файл и обновлять ее через регулярные промежутки времени, используя таймер.Затем, когда ваша программа запускается, она может сравнить временную метку в файле с текущим временем и выйти, если она слишком близка.Это гарантирует, что ваша программа сможет перезапускаться независимо от того, как она была прервана.

1 голос
/ 29 июля 2010

Это может быть немного много. Но вы можете запустить ServerSocket и привязать к некоторому произвольному порту, который знает каждое приложение. Если порт доступен, приложение запускается для запуска, если не создается исключение привязки, и приложение корректно останавливается.

1 голос
/ 29 июля 2010

Вы всегда можете обернуть свою Java-программу в другую программу (не должна быть сложной - это может быть даже сценарий оболочки), которая обнаружит аварийный выход и удалит файл. например,

if(!`java MyProgram`){
    rm lockFile
}
1 голос
/ 29 июля 2010

Создайте файл и оставьте его открытым с эксклюзивной блокировкой (то есть не передавайте FILE_SHARE_READ и т. Д.).Когда запускается второй экземпляр, он пытается открыть файл, и если он не работает, это означает, что первый все еще работает.

Если первый сбой, то Windows автоматически закроет все дескрипторы файлов, и поэтому второй процесс будетдавайте посмотрим, что файл есть, но, поскольку он может открыть его, он знает, что первый сбой (эта техника также может быть использована для специального диалога: «Я вижу, что предыдущий экземпляр этого приложения дает сбой, вы хотите восстановитьВаш последний сеанс? "или что-то)

0 голосов
/ 30 июля 2010

Предполагая, что блокировка будет снята при выходе из приложения, и удаление файла при запуске сделает свое дело. Смотрите ссылку ниже.

http://jimlife.wordpress.com/2008/07/21/java-application-make-sure-only-singleone-instance-running-with-file-lock-ampampampampamp-shutdownhook/

P.S .: Я пытался использовать delete при выходе из приложения, но, похоже, он не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...