Временный файл, блокировка одного экземпляра и уничтожение процесса (Java) - PullRequest
2 голосов
/ 10 августа 2010

В настоящее время я использую временную папку для своего Java-приложения, чтобы создать блокировку, чтобы одновременно мог работать только один экземпляр.Этот файл блокировки ДОЛЖЕН быть удален при выходе из программы.

Это нормально, за исключением случая, когда процесс завершен (обычное отключение запрещено, например, из диспетчера задач Windows).Если это произойдет, пользователь больше никогда не сможет запустить программу ... eek

У кого-нибудь есть предложения?Есть ли способ заставить ОС удалить папку при перезагрузке или что-то подобное?Должен ли я найти другой способ иметь «блокировку одного экземпляра?»

Кроме того, решение должно быть кросс-платформенным, если это возможно ...

Ответы [ 3 ]

3 голосов
/ 10 августа 2010

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

Используйте this (javasysmon) , чтобы получить PID, а также запущенные процессы на коробке

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

Для более надежного подключения JVM посмотрите на эту бумагу:
http://www.ibm.com/developerworks/java/library/i-signalhandling/

1 голос
/ 10 августа 2010

Когда приложение запускается, проверьте наличие файла блокировки, и, если он существует, выведите ошибку, в которой говорится что-то вроде: «Либо запущен другой экземпляр, либо у вас устаревшая блокировка. Если другой экземпляр не запущен, удалить xyz.lock и перезапустить ".

Лучшим решением может быть привязка к фиксированному (и нестандартному) порту TCP. Если вы не можете привязать его, предположите, что запущен еще один экземпляр вашего процесса.

В-третьих, и, вероятно, лучший способ - использовать java.nio.channels.FileLock для эксклюзивной блокировки файла.

0 голосов
/ 11 августа 2010

Вы можете посмотреть в File.deleteOnExit (). Это заставляет JVM удалить файл при выходе. Это не может быть отменено.

Но, как и другие ответы, вам нужно проверить, существует ли он при запуске.

...