[Java] Como controlar uma instância única de aplicação com FileLock

21 07 2010

Para você que quer implementar um controle de uma instância única de aplicação Desktop no  SO, abaixo segue um exemplo fácil e prático, que pode ser estendido para vários tipos de Lock.

      +---------------------+
      | Process Aplication  |
      +---------+-----------+
                |                  +-----------+
                |      Locked      | LockFile  |
                ''''''''''''''''''''-----+-----+
                                         |
                                         | TryLock
        +---------------------+   `.  .' |
        | Process Aplication  +-----`/---+
        +---------------------+    .' `.
  • Este mecanismo de Lock utiliza um sistema via arquivo, quando uma VM de um determinado modulo sobe, é criado um arquivo único para o modulo.  Sobre este arquivo é requisitado um lock de leitura e escrita,  o qual ficará ativo até a morte do processo, quando o processo morrer o lock também será liberado.
  • Quando uma outra VM do mesmo modulo sobe ela requisita o lock no mesmo arquivo,  como o lock já foi fornecido ao primeiro modulo ativo, o modulo que está tentando subir não ganha o lock, identificando assim que já existe um outro modulo ativo na mesma máquina.
public class AplicationLockService {    

    private AplicationLockService() {}

    public static boolean lockInstance(String fileLockPath) {
        try {
            final File file = new File(fileLockPath);
            final RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw"); //$NON-NLS-1$
            final FileLock fileLock = randomAccessFile.getChannel().tryLock();
            if (fileLock != null) {
                Runtime.getRuntime().addShutdownHook(new Thread() {
                    @Override
                    public void run() {
                        try {
                            fileLock.release();
                            randomAccessFile.close();
                            file.delete();
                        } catch (Exception e) {
                            LOGGER.error("Unable to remove lock file: " + fileLockPath, e); //$NON-NLS-1$
                        }
                    }
                });
                return true;
            }
        } catch (Exception e) {
            LOGGER.error("Unable to create and/or lock file: " + fileLockPath, e); //$NON-NLS-1$
        }
        return false;
    }
}

FONTE1
FONTE2

Anúncios

Ações

Information

One response

11 12 2014
lucas

muito bom

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: