Quantcast
Channel: Jimmy's Blog » Java
Viewing all articles
Browse latest Browse all 10

Java Application – Make sure only single/one instance running – with File Lock and ShutdownHook

$
0
0

Often we want to make sure that only 1 instance our application running.
Because something terrible could happen when more than 1 instance running (for example the whole server would exploded and that would make you fired ;) )

Nevertheless what the reason, one of the way to make this happen is by creating a lock file as a sign that an instance is currently running.
So you application will have this flow:

  1. Check if the lock file exists.
  2. Try to delete the lock file to check if there’s really a running process lock the file.
  3. Get the file lock.
  4. If failed to get the lock file, show error that there’s already an instance running
  5. If successfully get the lock then go on with your application want to do.
  6. When application ended/closed release the lock and delete the file lock.

package test.jimmy.filelock;
 
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
 
public class MyApp {
 
private static File f;
private static FileChannel channel;
private static FileLock lock;
 
public static void main(String[] args) {
  try {
    f = new File("RingOnRequest.lock");
    // Check if the lock exist
    if (f.exists()) {
    // if exist try to delete it
    f.delete();
  }
  // Try to get the lock
  channel = new RandomAccessFile(f, "rw").getChannel();
  lock = channel.tryLock();
  if(lock == null)
  {
    // File is lock by other application
    channel.close();
    throw new RuntimeException("Only 1 instance of MyApp can run.");
  }
  // Add shutdown hook to release lock when application shutdown
  ShutdownHook shutdownHook = new ShutdownHook();
  Runtime.getRuntime().addShutdownHook(shutdownHook);
 
  //Your application tasks here..
  System.out.println("Running");
  try {
    Thread.sleep(10000);
  } catch (InterruptedException e) {
    e.printStackTrace();
  } catch(IOException e) {
    throw new RuntimeException("Could not start process.", e);
  }
}
 
public static void unlockFile() {
// release and delete file lock
  try {
    if(lock != null)
    lock.release();
    channel.close();
    f.delete();
  } catch(IOException e) {
    e.printStackTrace();
  }
}
 
static class ShutdownHook extends Thread {
  public void run() {
    unlockFile();
  }
}
 
}

Technorati Tags: , , , , , ,


Viewing all articles
Browse latest Browse all 10

Trending Articles