Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать запуска второй копии программы, Если прокрамма использует сокет по назна 
V
    Опции темы
Su_
Дата 12.1.2010, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Добрый день.. Есть задача,сделать так что бы при втором запуске java-приложение, оно блокировалось и перекидывало фокус на уже открытое .. 

Разделил на два этапа 1)НЕ допустить запуска второй копии 2)Перебросить фокус

1)Почитал в интернете и тут, нашел два способа, это занимать порт и лочить файл.Т.к я и так занимаю порт под нужные цели, первым вариантом пользоваться не хочется . 2 )Нашел в интернете такую реализацию:
Код

try {
    // Get a file channel for the file
    File file = new File("filename");
    FileChannel channel = new RandomAccessFile(file, "rw").getChannel();

    // Use the file channel to create a lock on the file.
    // This method blocks until it can retrieve the lock.
    FileLock lock = channel.lock();

    // Try acquiring the lock without blocking. This method returns
    // null or throws an exception if the file is already locked.
    try {
        lock = channel.tryLock();
    } catch (OverlappingFileLockException e) {
        // File is already locked in this thread or virtual machine
    }

    // Release the lock
    lock.release();

    // Close the file
    channel.close();
} catch (Exception e) {
}



НО что в винде что в линуксе,всё время пишет что файл(ТХТ) залочен,т.е уходит на исключение
Что тут не так?

2)Можно ли вообще сделать фокусировку на приложение программно?




--------------------
user posted image

PM MAIL WWW   Вверх
Su_
Дата 12.1.2010, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



Первый вопрос решил)


--------------------
user posted image

PM MAIL WWW   Вверх
Su_
  Дата 12.1.2010, 02:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



По поводу первого пункта, может кому пригодится:
В начало программы:
Код

 accessTheLockedFile();
     if(number_of_copy==0)
     {
            try {
                   lock_file();
        }catch(IOException f)
        {
            System.out.println("error ini");
                 prints("Запущена вторая копия");
        }
     }else if(number_of_copy==1)
     {
         prints("Это ПРОГРАММА УЖЕ ЗАПУЩЕННА!,закройти приложение и откройте 'ALT+TAB' уже запущенную программу");
         System.exit(0);
     }
     if(block)
     {
         System.exit(0);
     }


методы 
Код

  public void lock_file() throws FileNotFoundException, IOException
    {
  RandomAccessFile file = null;
        FileLock fileLock = null;
        try
        {
         //    prints("1");
            file = new RandomAccessFile(PathtoLockFile, "rw");
          //     prints("2");
            FileChannel fileChannel = file.getChannel();
  // prints("3");
            fileLock = fileChannel.tryLock();
           //    prints("4");
            if (fileLock != null){
               prints("Приложение запущенно");
               number_of_copy=1;
              accessTheLockedFile();
            }
        }finally{
            if (fileLock != null){
             //    prints("5");
                 block=false;

            }
        }
    }

     static void accessTheLockedFile(){

        try{
            FileInputStream input = new FileInputStream(PathtoLockFile);
            int data = input.read();
            System.out.println(data);
        //    prints("ФАЙЛ РАЗБЛОКИРОВАН!");
            number_of_copy=0;
        }catch (Exception exception){
            exception.printStackTrace();
          //    prints("ФАЙЛ ЗАБЛОКИРОВАН!");
            number_of_copy=1;
        }
    }


Работает и в win и в lin, при чем: В винде блокирует файлы нормально, в Линуксе файл не блокирует , но повторно войти в 
Код

     if (fileLock != null){
             //    prints("5");
                 block=false;

            }

не может. Для этого еще есть проверка флага block. Почему не блокирует файл я так и не понял, но это работает.

Осталось разворачивать уже запущенное приложение вместо запуска ещё одной копии (lin) ???


--------------------
user posted image

PM MAIL WWW   Вверх
Su_
Дата 12.1.2010, 02:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



увы этот алгоритм дает сбой в Linux.. отсюда вопрос как заблокировать файл в linux?????????7


--------------------
user posted image

PM MAIL WWW   Вверх
dobrolub
Дата 12.1.2010, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Thread t = new Thread() {
  public void run() {
      new FileInputStream("zzz").getChannel().tryLock(); 
   }
};

t.start();
t.join(100);//даём 100 ms на захват лока.

try {
  t.interrupt();
} catch (Exception e) {
 //обработка 
}

Это сообщение отредактировал(а) dobrolub - 12.1.2010, 03:00
PM   Вверх
Su_
Дата 12.1.2010, 03:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



если это повесить на кнопку 
Код

    try {
            //chek_alarm();
    new FileInputStream("zzz").getChannel().tryLock();

    }catch(IOException f)
        {
          System.out.println("Не могу заблокировать");
        }
            //tcp_socket_busy=false;        // TODO add your handling code here:
    } 

вылетает на исключение ,при чем не на IOException


А вообще линукс поддерживает блокировку файлов?

Добавлено через 6 минут и 25 секунд
для запуска
Код


import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Admin
 */
public class NewClass {
Thread t = new Thread() {
  public void run() {
            try {
                new FileInputStream("zzz").getChannel().tryLock();
            } catch (IOException ex) {
                Logger.getLogger(NewClass.class.getName()).log(Level.SEVERE, null, ex);
            }
   }
};
NewClass() throws InterruptedException
{
t.start();
t.join(100);//даём 100 ms на захват лока.

try {
  t.interrupt();
} catch (Exception e) {
 //обработка
}
}

 public static void main(String[] args) throws InterruptedException
  {
     NewClass f=new NewClass();
  }
}



после запуска
Код

run:
Exception in thread "Thread-0" java.nio.channels.NonWritableChannelException
        at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:875)
        at java.nio.channels.FileChannel.tryLock(FileChannel.java:962)
        at NewClass$1.run(NewClass.java:20)
BUILD SUCCESSFUL (total time: 0 seconds)


Я не очень понимаю,почему в винде блокирует нормально,а в линуксе нет.?


--------------------
user posted image

PM MAIL WWW   Вверх
dobrolub
Дата 12.1.2010, 03:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



Возможно баг в JDK, но вроде с помощью exception всё можно отследить как я понял.
PM   Вверх
Su_
Дата 12.1.2010, 03:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



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


--------------------
user posted image

PM MAIL WWW   Вверх
dobrolub
Дата 12.1.2010, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



так получается что не за что :(

слушай а что за JDK / Linux?
PM   Вверх
Su_
Дата 12.1.2010, 03:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



java-1.6.0-openJDK уже стояло на мое MandrivaFree2009. Я думаю тут различие идет по возможности lock/unlock по ОС а не по JDK


--------------------
user posted image

PM MAIL WWW   Вверх
dobrolub
Дата 12.1.2010, 04:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



на debian 5 с JDK от Sun.
java version "1.6.0_07"
Java™ SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot™ Client VM (build 10.0-b23, mixed mode, sharing)

код внизу отработал нормально.
Код

import java.io.*;
import java.nio.*;

public class T {
    public static void main(String[] args) throws Exception {
        System.out.println(new FileOutputStream("xxx").getChannel().tryLock());

        synchronized(T.class) {
            T.class.wait();
        }
    }
}


первый запуск:
Код

x@debian:/tmp$ java T
sun.nio.ch.FileLockImpl[0:9223372036854775807 exclusive valid]

второй - параллельный запуск
Код

x@debian:/tmp$ java T
null


Добавлено через 13 минут и 39 секунд
проверил с версией 1.5 - тоже работает. То есть возможно проблема в JDK

java version "1.5.0_16"
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_16-b02)
Java HotSpot™ Client VM (build 1.5.0_16-b02, mixed mode, sharing)



Это сообщение отредактировал(а) dobrolub - 12.1.2010, 04:27
PM   Вверх
Su_
Дата 12.1.2010, 04:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



ого Спасибо, это важно для меня ..поковыряюсь с JDK)

Добавлено через 9 минут и 5 секунд
Слушай у меня такой же вывод выдает теперь.. может я где то напортачил ,надо больше спать) Спасибо большое !


--------------------
user posted image

PM MAIL WWW   Вверх
Su_
Дата 12.1.2010, 05:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 386
Регистрация: 1.8.2007

Репутация: нет
Всего: нет



токо не понял почему он в дальнейшем сбрасывает Lock , если в этом же потоке работать с файлами)


--------------------
user posted image

PM MAIL WWW   Вверх
dobrolub
Дата 12.1.2010, 05:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



я думаю что lock сбрасывается когда переменные выходят из области видимости и собираются мусорщиком. 
Лучше бы переменные связанные с этим локом положить в новую thread и добавить её kak shutdownHook

Runtime.getRuntime().addShutdownHook(new Thread() {
  public void run() {
    //освободить локи, закрыть выходные потоки.
  }
});



      
      

PM   Вверх
dobrolub
Дата 12.1.2010, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 385
Регистрация: 18.12.2009
Где: Vancouver, Canada

Репутация: 11
Всего: 16



>1)Почитал в интернете и тут, нашел два способа, это занимать порт и лочить файл.Т.к я и так занимаю порт под нужные цели, первым вариантом пользоваться не хочется

Я про порт не понял, с ним железней, в общем-то, тем более он так и так должен выделиться системой.
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0934 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.