如何只启动一份java程序呢?
在一些特殊的场景中,我们需保证一个java程序只能运行一份,那么如何在程序上实现这个效果呢?
下文笔者将一一道来,如下所示
下文笔者将一一道来,如下所示
限制程序单份运行的思路:
方式1:
web程序使用端口冲突,避免启动两份Java程序
方式2:
使用文件排他锁,当拿到锁,则可以启动程序
使用此种方式需注意:关闭程序时,一定要释放排他锁
例:文件排他锁的方式,规避程序启动多份
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
@Slf4j
public class ProcessLock {
private static final String FILE_NAME = "process.lock";
private static FileChannel fileChannel;
public static boolean tryLock(String lockFileDir) {
log.info("lockFileDir: {}", lockFileDir);
try {
String dir = lockFileDir;
if (StringUtils.isBlank(dir)) {
dir = "./";
} else {
if (dir.charAt(dir.length() - 1) != '/') {
dir = dir + "/";
}
}
File file = new File(dir + FILE_NAME);
if (!file.exists()) {
if (!file.createNewFile()) {
log.error("Create file " + file.getAbsolutePath() + " fail");
return false;
}
}
RandomAccessFile raf = new RandomAccessFile(file, "rw");
fileChannel = raf.getChannel();
FileLock fileLock = fileChannel.tryLock();
if (fileLock == null) {
log.info("fileLock is null");
return false;
}
return fileLock.isValid();
} catch (Exception ex) {
log.error("tryLock fail", ex);
}
return false;
}
public static void unlock() {
if (fileChannel != null) {
try {
fileChannel.close();
} catch (IOException ex) {
log.error("", ex);
}
}
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


