mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
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:
@@ -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())
|
if (logger.isInfoEnabled())
|
||||||
{
|
{
|
||||||
logger.info("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken);
|
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())
|
||||||
|
{
|
||||||
|
logger.debug("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken);
|
||||||
}
|
}
|
||||||
lockToken = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user