程序鎖

有一些服務,在線上不能同時運行,此時就須要一個文件鎖來判斷程序是否是已經有一個實例在運行了。得益於一個老大貢獻代碼,特別粘在這裏。java

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去生成文件app

lock =newFileOutputStream(flagFile).getChannel.tryLock();在得到文件的時候嘗試去lock,若是lock成功,就會返回這個實例的lock。不然,lock失敗,返回null,就說明已經有一個程序鎖住了這個文件。this

本文出自 「沐浴心情」 博客,請務必保留此出處http://lj3331.blog.51cto.com/5679179/1250301scala

相關文章
相關標籤/搜索