Предотвращение нескольких экземпляров приложения

Поскольку каждое приложение работает в его собственной виртуальной машины Java, нет очевидного способа обнаружить, если particuliar приложение уже запущено.

Socket техника

Один из способов обнаружить во избежание многократного выполнения приложений является использование простых сервер сокет. Приложение попытается соединение с этим сервером, если это успех, то программа уже работает (и остановить приложение), если нет соединения сделано, то применение создать сервер.

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


[JustOneServer.java]

        

import java.io.*;

import java.net.*;



public class JustOneServer extends Thread {

    // you may need to customize this for your machine

    public static final int PORT = 80 ;

    

    ServerSocket serverSocket = null;

    Socket clientSocket = null;

    

    public void run() {

        try {

            // Create the server socket

            serverSocket = new ServerSocket(port, 1);

            while (true) {

                // Wait for a connection

                clientSocket = serverSocket.accept();

                // System.out.println("*** Got a connection! ");

                clientSocket.close();

            }

        catch (IOException ioe) {

            System.out.println("Error in JustOneServer: " + ioe);

        }

    }

}





[JustOne.java]

        

import java.io.*;

import java.net.*;



public class JustOne {

    

    SimpleDummyServer sds = null;

    

    public static void main(String args[]){

        new JustOne().doit();

    }

    

    public void doit() {

        

        try {

            Socket clientSocket = new Socket("localhost", JustOneServer.PORT);

            System.out.println("*** Already running!");

            System.exit(1);

        catch (Exception e) {

            sds = new JustOneServer();

            sds.start();

        }

        

        while(true) {

            try 

            

                System.out.print(".")

                Thread.sleep(60)

            

            catch(Exception e) { 

                e.printStackTrace()

            }

        }

    }

}

Чтобы проверить это, откройте консоль 2.

В консоли 1, тип Java JustOne.

В консоли 2, тип JustOne и Java-приложение должно реагирования "уже работает!".

Техника File Lock

[JDK1.4] Вы можете использовать флаг файла с блокировки механизма. Идея заключается в создании и блокировку файлов на user.home папку с названием условия. Одновременное исполнение попытается заблокировать и тот же файл и не удалось. Специальные "Shutdown крючок" обеспечивается, чтобы разблокировать файл, если JVM выключается.


[JustOneLock.java]

        

import java.io.*;

import java.nio.channels.*;



public class JustOneLock {



    private String appName;

    private File file;

    private FileChannel channel;

    private FileLock lock;

    

    public JustOneLock(String appName) {

        this.appName = appName;

    }

    

    public boolean isAppActive() {

        try {

            file = new File(System.getProperty("user.home"), appName + ".tmp");

            channel = new RandomAccessFile(file, "rw").getChannel();

            

            try {

                lock = channel.tryLock();

            catch (OverlappingFileLockException e) {

                // already locked

                closeLock();

                return true;

            }

            

            if (lock == null) {

                closeLock();

                return true;

            }

            

            Runtime.getRuntime().addShutdownHook(new Thread() {

                // destroy the lock when the JVM is closing

                public void run() {

                    closeLock();

                    deleteFile();

                }

            });

            return false;

        catch (Exception e) {

            closeLock();

            return true;

        }

    }

    

    private void closeLock() {

        try lock.release();  catch (Exception e) {  }

        try channel.close()catch (Exception e) {  }

    }

    

    private void deleteFile() {

        try file.delete()catch (Exception e) { }

    }

}



[JustOneTest.java]

        

public class JustOneTest {

    

    public static void main(String[] args) {

        new JustOneTest().test();

    }

    

    void test() {

        JustOneLock ua = new JustOneLock("JustOneId");

        

        if (ua.isAppActive()) {

            System.out.println("Already active.");

            System.exit(1);

        else {

            System.out.println("NOT already active.");

            try {

                while(true) {

                    try 

                        System.out.print(".")

                        Thread.sleep(60)

                    catch(Exception e) { 

                        e.printStackTrace()

                    }

                }

            catch (Exception e) {  }

        }

    }

}

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>