HttpsTest.java › MSWindowsTip › JSLibrary › cal › TheGreatBigEnormouseTurnip › com.gimslab.util.batch.UniqLoopingBatchProcess.java
/* * 파일명 : UniqoopingBatchProcess.java * 설명 : Loop를 돌며 작업수행하고 해당 프로세스(jvm)가 os상에 한 개만 떠 있도록 함 * 작성자 : gimslab@gmail.com * 최초작성 : 20070503 */ package com.gimslab.util.batch; import java.io.*; public abstract class UniqLoopingBatchProcess { private File lockFile; private long loopSleepMSec; public UniqLoopingBatchProcess(String lockFilename, long loopSleepMSec) { File tmpDir = new File(System.getProperty("java.io.tmpdir")); this.lockFile = new File(tmpDir, lockFilename); this.loopSleepMSec = loopSleepMSec; } public void startJob() throws Exception { while(shouldLoop()){ boolean locked = false; try{ locked = lock(); if(!locked) break; doJob(); try{ Thread.sleep(this.loopSleepMSec); } catch(InterruptedException ie){ ie.printStackTrace(); } } finally{ if(locked) freeLock(); } } } private boolean lock() { try{ boolean created = this.lockFile.createNewFile(); if(created){ this.lockFile.deleteOnExit(); return true; } System.out.println("LOCK FILE("+this.lockFile.getCanonicalPath()+") exist. i'm dying."); return false; } catch(IOException ioe){ ioe.printStackTrace(); return false; } } private void freeLock() { if(!this.lockFile.exists()) return; boolean deleted = this.lockFile.delete(); if(!deleted){ System.err.println("CANNOT DELETE LOCKFILE - " + this.getClass().getName() + "::freeLock()"); } } // 처리할 작업내용을 구현 abstract protected void doJob(); // 루프를 계속 돌아야하는지를 확인 abstract protected boolean shouldLoop() throws Exception; }