Unable to lock files on Linux using java.nio.channels.FileLock

后端 未结 6 1166
花落未央
花落未央 2020-12-11 20:34

I was creating an application in Java for which I want only one instance running. For this purpose I created a file and got a lock while my application is running.

I

6条回答
  •  清歌不尽
    2020-12-11 20:39

    Recently i encountered the same kind of problem, but in my case i had an advantage: my application polled some directory only after some timeout. As my application did not immediately poll for directory i wrote special class that creates lock file with his own PID inside in init method, after that before it tries to work with directory it needs to call ownedLock() - if it returns true then we can work otherwise exit(code is in Kotlin but you will get the main idea):

    import java.io.File
    import java.lang.management.ManagementFactory
    class DirectoryLocker(private val directory: String, private val lockName: String) {
       private val lockFile by lazy { File("$directory/$lockName.lock") }
    
       // Will try to acquire lock to directory, whoever last writes its pid to file owns the directory
       fun acquireLock() = with(lockFile) {
          createNewFile()
          writeText(currentPID())
       }
    
       fun ownedLock(): Boolean = lockFilePid() == currentPID()
    
       fun releaseOwnedLock() {
          if(lockFilePid() == currentPID()) lockFile.delete()
       }
    
       private fun currentPID(): String {
          val processName = ManagementFactory.getRuntimeMXBean().name
          return processName.split("@".toRegex()).first()
       }
    
       private fun lockFilePid(): String? {
          return if(lockFile.exists()) lockFile.readLines().first() else null
       }
    }
    

提交回复
热议问题