有一些服务,在线上不能同时运行,此时就需要一个文件锁来判断程序是不是已经有一个实例在运行了。得益于一个老大贡献代码,特别粘在这里。
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,就说明已经有一个程序锁住了这个文件。
转载于:https://blog.51cto.com/lj3331/1250301