package org.rzo.netty.ahessian.timeout;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import org.jboss.netty.util.Timeout;
import org.jboss.netty.util.Timer;
import org.jboss.netty.util.TimerTask;
public class IntervalTimer
{
private final Timer _timer;
private final TimerTask _task;
private volatile Timeout _timeout;
private final long _interval;
private volatile String _name = "?";
private final Lock _lock = new ReentrantLock();
public IntervalTimer(final Timer timer, final TimerTask task, final long interval)
{
_timer = timer;
_task = new TimerTask()
{
public void run(Timeout timeout) throws Exception
{
_lock.lock();
try
{
if (!timeout.equals(getTimeout()))
{
//System.out.println("other timeout -> ignore");
return;
}
//System.out.println(new Date()+" timer called " + _name+"/"+_interval);
try
{
task.run(timeout);
}
catch (Throwable ex)
{
ex.printStackTrace();
}
if (getTimeout() != null)
setTimeout(_timer.newTimeout(this, interval, TimeUnit.MILLISECONDS));
}
finally
{
_lock.unlock();
}
}
};
_interval = interval;
}
synchronized public void start()
{
_lock.lock();
try
{
if (_timeout != null)
return;
//System.out.println("starting timer "+_name);
setTimeout(_timer.newTimeout(_task, _interval, TimeUnit.MILLISECONDS));
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
_lock.unlock();
}
}
synchronized public void stop()
{
_lock.lock();
try
{
if (getTimeout() == null)
return;
//System.out.println("stopping timer "+_name);
getTimeout().cancel();
setTimeout(null);
}
catch (Exception ex)
{
ex.printStackTrace();
}
finally
{
_lock.unlock();
}
}
synchronized public boolean isActive()
{
return _timeout != null;
}
public long getInterval()
{
return _interval;
}
public void setName(String name)
{
_name = name;
}
private Timeout getTimeout()
{
return _timeout;
}
private void setTimeout(Timeout timeout)
{
_timeout = timeout;
}
}