Семафор для всей Linux с API Java - PullRequest
       2

Семафор для всей Linux с API Java

0 голосов
/ 25 сентября 2011

Мне нужно, чтобы определенная функция приложения не запускалась одновременно с самой собой.Риск значительный, потому что эта функция находится в коде, переданном в java.util.Timer (повторяется каждую минуту в течение нескольких часов), и процесс, который устанавливает функцию, завершается и возвращается к командной строке bash.Затем пользователь может вызвать ту же программу.Другой риск связан с тем, что у пользователя есть два или более консольных окна, и они по ошибке запускают программу в обоих консольных окнах.

Я думаю, что семафор в масштабе всей операционной системы с Java API может помочь.Доступен ли такой архив Java?

Меня спросили, используются ли несколько JVM.Я думаю, что если открыто несколько консолей, то подразумевается наличие нескольких JVM.

Это моя оболочка для использования Java Timer и TimerTask.

public final class TimedExecutorWrapper
{       ... various private members ... 
        public Timer go()
        {
            Timer myTimer = new Timer();
            myTimer.scheduleAtFixedRate(this.myTask, 
                                        this.startTodayAtThisTime, 
                                        this.frequencyInSeconds * 1000);
            TimerTask myTaskToInvokeCancel = new TaskToInvokeCancel(myTimer);

            // use the same Timer to schedule the task that cancels and purges
            myTimer.schedule(myTaskToInvokeCancel,
                             this.stopTodayAtThisTime);
            return myTimer;
        }

        private final class TaskToInvokeCancel extends TimerTask
        {
                private Timer timer; // to be cancelled and purged

                TaskToInvokeCancel(Timer timer)
                {
                    this.timer = timer;
                }

                public void run()
                {
                  this.timer.cancel(); // discards any scheduled tasks without 
                                     //  interfering with any running task
                  this.timer.purge(); 
                }
        }
}

Ответы [ 3 ]

2 голосов
/ 25 сентября 2011

Вы можете создать 0-байтовый файл 'methodname.LOCK' в общем каталоге, когда вы начнете операцию, и удалить его, когда вы закончите. Создание его с флагом отсутствия воссоздания в Java должно решить вашу проблему.

Обязательно удалите его в блоке finally, чтобы вы никогда не оставались в состоянии, в котором файл существует и продолжает блокировать процесс с ever running

1 голос
/ 25 сентября 2011

просто откройте сокет сервера на определенном порту.если это успешно, другого приложения нет, если не выдается исключение.

0 голосов
/ 26 сентября 2011

Единственная стандартная функция Java, которую я видел, которая запрещает несколько экземпляров одной и той же программы, - это SingleInstanceService в Java WebStart.

http://download.oracle.com/javase/1.5.0/docs/guide/javaws/developersguide/examples.html#SingleInstanceService

Требуется, чтобы вы создалиФайл JNLP для вашего приложения, который немного громоздок, но в любом случае может быть очень полезным для вас.Обратите внимание, что Java не позволяет передавать параметры командной строки в вашу программу, что может быть очень неудобно в этой ситуации.Зависит от того, что говорит ваша командная строка.

Если Java WebStart не работает для вас, вы должны запросить у операционной системы ресурс, для которого запрещены последующие запросы, и автоматически освободить его.Единственным из них, не зависящим от платформы, является сокет TCP / IP, но они редки и могут использоваться другой программой.Под Linux вы можете запросить общую память, но у меня нет личного опыта с этим.

...