有一些服务,在线上不能同时运行,此时就需要一个文件锁来判断程序是不是已经有一个实例在运行了。得益于一个老大贡献代码,特别粘在这里。
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
=
new
FileOutputStream(flagFile).getChannel.tryLock();
在获得文件的时候尝试去lock,如果lock成功,就会返回这个实例的lock。否则,lock失败,返回null,就说明已经有一个程序锁住了这个文件。
本文出自 “沐浴心情” 博客,请务必保留此出处http://lj3331.blog.51cto.com/5679179/1250301
转载自原文链接, 如需删除请联系管理员。
原文链接:程序锁,转载请注明来源!