程序锁

有一些服务,在线上不能同时运行,此时就需要一个文件锁来判断程序是不是已经有一个实例在运行了。得益于一个老大贡献代码,特别粘在这里。

import java.io.File;
import java.io.FileOutputStream;
import java.nio.channels.FileLock
/**
 * Created by IntelliJ IDEA.
 * User: liu
 * Date: 12-11-19
 * Time: 下午5:42
 * To change this template use File | Settings | File Templates.
 */
object InstanceLock {
  var lock: FileLock = null
  val filePath: String = sys.props("user.home") + File.separator + ".lock"
  /**
   * 程序已经运行了一个时,返回false,说明本次程序不应该启动
   * 否则可以启动
   * @return Boolean
   * @see
   */
  def shouldRun(app: String): Boolean = {
    try {
      val file: File = new File(filePath)
      if (!file.exists())
        file.mkdir()
      // 获得实例标志文件
      val flagFile: File = new File(file, app + ".lock")
      // 如果不存在就新建
      if (!flagFile.exists())
        flagFile.createNewFile();
      // 获得文件
      lock = new FileOutputStream(flagFile).getChannel.tryLock();
      // 返回空表示文件已被运行的实例锁定
      if (lock == null)
        return false
    } catch {
      case ex: Exception => ex.printStackTrace();
    }
    true
  }
}

利用java的文件锁FileLock,程序按照一定的规则,这里是app:String去生成文件

lock =newFileOutputStream(flagFile).getChannel.tryLock();在获得文件的时候尝试去lock,如果lock成功,就会返回这个实例的lock。否则,lock失败,返回null,就说明已经有一个程序锁住了这个文件。

本文出自 “沐浴心情” 博客,请务必保留此出处http://lj3331.blog.51cto.com/5679179/1250301

你可能感兴趣的:(java,FileLock)