From 31525f85c6ab0cd2043e5336082dda0a6ba40dcb Mon Sep 17 00:00:00 2001 From: Steven Glover Date: Fri, 3 Feb 2012 14:20:12 +0000 Subject: [PATCH] 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 --- .../feed/AbstractFeedGenerator.java | 110 +++++++++--------- 1 file changed, 57 insertions(+), 53 deletions(-) diff --git a/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java b/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java index 0a0d5fd608..1008cec858 100644 --- a/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java +++ b/source/java/org/alfresco/repo/activities/feed/AbstractFeedGenerator.java @@ -62,7 +62,7 @@ public abstract class AbstractFeedGenerator implements FeedGenerator private RepoCtx ctx = null; - private LockTracker lockTracker = new LockTracker(); + private volatile boolean busy; public void setActivityPostServiceImpl(ActivityPostServiceImpl activityPostServiceImpl) { @@ -128,6 +128,8 @@ public abstract class AbstractFeedGenerator implements FeedGenerator { ctx = new RepoCtx(repoEndPoint); ctx.setUserNamesAreCaseSensitive(userNamesAreCaseSensitive); + + busy = false; } /** @@ -142,6 +144,11 @@ public abstract class AbstractFeedGenerator implements FeedGenerator abstract public int getEstimatedGridSize(); + protected boolean isActive() + { + return busy; + } + public void execute() throws JobExecutionException { checkProperties(); @@ -155,10 +162,14 @@ public abstract class AbstractFeedGenerator implements FeedGenerator } return; } - + + String lockToken = null; + try { - acquireLock(); + JobLockRefreshCallback lockCallback = new LockCallback(); + lockToken = acquireLock(lockCallback); + if (logger.isTraceEnabled()) { @@ -195,73 +206,66 @@ public abstract class AbstractFeedGenerator implements FeedGenerator } finally { - releaseLock(); + releaseLock(lockToken); } } 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 public boolean isActive() { - return (lockToken != null); + return busy; } - + @Override public void lockReleased() { // 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()) { - logger.info("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken); + logger.debug("Lock released (refresh failed): " + LOCK_QNAME + ", lock token " + lockToken); } - lockToken = null; } } } \ No newline at end of file