Another way of doing it is by extending the AbstractScheduledLockedJob class and overriding
public void executeJob(JobExecutionContext context)
throws JobExecutionException {} method.
The parent class manages locking using the method
/**
* Lazily update the job lock
*/
private void refreshLock()
{
Pair<Long, String> lockPair = lockThreadLocal.get();
if (lockPair == null)
{
String lockToken = jobLockService.getLock(lockQName, LOCK_TTL);
Long lastLock = new Long(System.currentTimeMillis());
// We have not locked before
lockPair = new Pair<Long, String>(lastLock, lockToken);
lockThreadLocal.set(lockPair);
}
else
{
long now = System.currentTimeMillis();
long lastLock = lockPair.getFirst().longValue();
String lockToken = lockPair.getSecond();
// Only refresh the lock if we are past a threshold
if (now - lastLock > (long) (LOCK_TTL / 2L))
{
jobLockService.refreshLock(lockToken, lockQName, LOCK_TTL);
lastLock = System.currentTimeMillis();
lockPair = new Pair<Long, String>(lastLock, lockToken);
lockThreadLocal.set(lockPair);
}
}
}
Thanks,
Patil