有一些服務,在線上不能同時運行,此時就須要一個文件鎖來判斷程序是否是已經有一個實例在運行了。得益於一個老大貢獻代碼,特別粘在這裏。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
=
new
FileOutputStream(flagFile).getChannel.tryLock();
在得到文件的時候嘗試去lock,若是lock成功,就會返回這個實例的lock。不然,lock失敗,返回null,就說明已經有一個程序鎖住了這個文件。this
本文出自 「沐浴心情」 博客,請務必保留此出處http://lj3331.blog.51cto.com/5679179/1250301scala