Merged BRANCHES/DEV/V4.0-BUG-FIX to HEAD:

33452: Fix for ALF-12536
   33536: Fix for ALF-12536: hopefully this will be the final fix.

git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@33640 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Steven Glover
2012-02-03 14:20:12 +00:00
parent 920896a63a
commit 31525f85c6

View File

@@ -62,7 +62,7 @@ public abstract class AbstractFeedGenerator implements FeedGenerator
private RepoCtx ctx = null; private RepoCtx ctx = null;
private LockTracker lockTracker = new LockTracker(); private volatile boolean busy;
public void setActivityPostServiceImpl(ActivityPostServiceImpl activityPostServiceImpl) public void setActivityPostServiceImpl(ActivityPostServiceImpl activityPostServiceImpl)
{ {
@@ -128,6 +128,8 @@ public abstract class AbstractFeedGenerator implements FeedGenerator
{ {
ctx = new RepoCtx(repoEndPoint); ctx = new RepoCtx(repoEndPoint);
ctx.setUserNamesAreCaseSensitive(userNamesAreCaseSensitive); ctx.setUserNamesAreCaseSensitive(userNamesAreCaseSensitive);
busy = false;
} }
/** /**
@@ -142,6 +144,11 @@ public abstract class AbstractFeedGenerator implements FeedGenerator
abstract public int getEstimatedGridSize(); abstract public int getEstimatedGridSize();
protected boolean isActive()
{
return busy;
}
public void execute() throws JobExecutionException public void execute() throws JobExecutionException
{ {
checkProperties(); checkProperties();
@@ -156,9 +163,13 @@ public abstract class AbstractFeedGenerator implements FeedGenerator
return; return;
} }
String lockToken = null;
try try
{ {
acquireLock(); JobLockRefreshCallback lockCallback = new LockCallback();
lockToken = acquireLock(lockCallback);
if (logger.isTraceEnabled()) if (logger.isTraceEnabled())
{ {
@@ -195,73 +206,66 @@ public abstract class AbstractFeedGenerator implements FeedGenerator
} }
finally finally
{ {
releaseLock(); releaseLock(lockToken);
} }
} }
protected abstract boolean generate() throws Exception; protected abstract boolean generate() throws Exception;
private void acquireLock() throws LockAcquisitionException private class LockCallback implements JobLockRefreshCallback
{ {
// Try to get lock
String lockToken = jobLockService.getLock(LOCK_QNAME, LOCK_TTL);
// Got the lock - now register the refresh callback which will keep the lock alive.
this.lockTracker.refreshLock(lockToken);
if (logger.isDebugEnabled())
{
logger.debug("lock aquired: " + lockToken);
}
}
private void releaseLock()
{
lockTracker.releaseLock();
}
private class LockTracker implements JobLockRefreshCallback
{
private String lockToken = null;
void refreshLock(String lockToken)
{
if(this.lockToken != null)
{
throw new IllegalStateException("lockToken is not null");
}
this.lockToken = lockToken;
jobLockService.refreshLock(lockToken, LOCK_QNAME, LOCK_TTL, this);
}
void releaseLock()
{
if(isActive())
{
jobLockService.releaseLock(lockToken, LOCK_QNAME);
lockToken = null;
if (logger.isInfoEnabled())
{
logger.info("Lock released: " + LOCK_QNAME + ", lock token " + lockToken);
}
}
}
@Override @Override
public boolean isActive() public boolean isActive()
{ {
return (lockToken != null); return busy;
} }
@Override @Override
public void lockReleased() public void lockReleased()
{ {
// note: currently the cycle will try to complete (even if refresh failed) // note: currently the cycle will try to complete (even if refresh failed)
synchronized(this)
{
if (logger.isInfoEnabled())
{
logger.debug("Lock released (refresh failed): " + LOCK_QNAME);
}
busy = false;
}
}
}
private String acquireLock(JobLockRefreshCallback lockCallback) throws LockAcquisitionException
{
// Try to get lock
String lockToken = jobLockService.getLock(LOCK_QNAME, LOCK_TTL);
// Got the lock - now register the refresh callback which will keep the lock alive
jobLockService.refreshLock(lockToken, LOCK_QNAME, LOCK_TTL, lockCallback);
busy = true;
if (logger.isDebugEnabled())
{
logger.debug("lock aquired: " + lockToken);
}
return lockToken;
}
private void releaseLock(String lockToken)
{
if (lockToken != null)
{
busy = false;
jobLockService.releaseLock(lockToken, LOCK_QNAME);
if (logger.isInfoEnabled()) if (logger.isInfoEnabled())
{ {
logger.info("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken); logger.debug("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken);
} }
lockToken = null;
} }
} }
} }