/* 
 * 파일명 : 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;
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2008-09-29 15:39:35
Processing time 0.0041 sec