如何只启动一份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); } } } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。