Author: sergiykarpenko
Date: 2010-10-22 05:08:28 -0400 (Fri, 22 Oct 2010)
New Revision: 3334
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemoverHolder.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/proccess/WorkerService.java
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryInfo.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/jdbc/CacheableJDBCLockManagerImpl.java
jcr/trunk/exo.jcr.component.core/src/main/resources/binding.xml
Log:
EXOJCR-999: WorkerService added, LockRemover made as single per-repository thread
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryInfo.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryInfo.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/config/RepositoryInfo.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -46,6 +46,8 @@
protected long sessionTimeOut;
+ protected int lockRemoverMaxThreadCount;
+
public RepositoryInfo()
{
@@ -190,17 +192,43 @@
}
/**
+ * Returns LockRemovers per-repository max threads count.
+ * @return LockRemovers per-repository max threads count
+ */
+ public int getLockRemoverThreadsCount()
+ {
+ return lockRemoverMaxThreadCount;
+ }
+
+ /**
+ * Sets LockRemovers per-repository max threads count.
+ * @param lockRemoverMaxThreadCount
+ */
+ public void setLockRemoverThreadsCount(int lockRemoverMaxThreadCount)
+ {
+ this.lockRemoverMaxThreadCount = lockRemoverMaxThreadCount;
+ }
+
+ /**
* Merges the current {@link RepositoryInfo} with the given one. The current {@link
RepositoryInfo}
* has the highest priority thus only absent data will be overrode
* @param entry the entry to merge with the current {@link RepositoryInfo}
*/
void merge(RepositoryInfo entry)
{
- if (systemWorkspaceName == null)
setSystemWorkspaceName(entry.systemWorkspaceName);
- if (defaultWorkspaceName == null)
setDefaultWorkspaceName(entry.defaultWorkspaceName);
- if (accessControl == null) setAccessControl(entry.accessControl);
- if (securityDomain == null) setSecurityDomain(entry.securityDomain);
- if (authenticationPolicy == null)
setAuthenticationPolicy(entry.authenticationPolicy);
- if (sessionTimeOut == 0) setSessionTimeOut(entry.sessionTimeOut);
- }
+ if (systemWorkspaceName == null)
+ setSystemWorkspaceName(entry.systemWorkspaceName);
+ if (defaultWorkspaceName == null)
+ setDefaultWorkspaceName(entry.defaultWorkspaceName);
+ if (accessControl == null)
+ setAccessControl(entry.accessControl);
+ if (securityDomain == null)
+ setSecurityDomain(entry.securityDomain);
+ if (authenticationPolicy == null)
+ setAuthenticationPolicy(entry.authenticationPolicy);
+ if (sessionTimeOut == 0)
+ setSessionTimeOut(entry.sessionTimeOut);
+ if (lockRemoverMaxThreadCount == 0)
+ setLockRemoverThreadsCount(entry.lockRemoverMaxThreadCount);
+ }
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/RepositoryContainer.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -43,6 +43,7 @@
import org.exoplatform.services.jcr.impl.core.WorkspaceInitializer;
import org.exoplatform.services.jcr.impl.core.access.DefaultAccessManagerImpl;
import org.exoplatform.services.jcr.impl.core.lock.LockManagerImpl;
+import org.exoplatform.services.jcr.impl.core.lock.LockRemoverHolder;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeDataManagerImpl;
import org.exoplatform.services.jcr.impl.core.nodetype.NodeTypeManagerImpl;
import
org.exoplatform.services.jcr.impl.core.nodetype.registration.JCRNodeTypeDataPersister;
@@ -516,6 +517,7 @@
// WorkspaceFileCleanerHolder - is a common holder for all workspaces.
// It is used to initialize FileValueStorage
registerComponentImplementation(FileCleanerHolder.class);
+ registerComponentImplementation(LockRemoverHolder.class);
registerWorkspacesComponents();
registerRepositoryComponents();
}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockManagerImpl.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -22,7 +22,6 @@
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
-import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
import org.exoplatform.services.jcr.core.ExtendedSession;
import org.exoplatform.services.jcr.dataflow.ChangesLogIterator;
@@ -52,6 +51,7 @@
import org.exoplatform.services.jcr.util.IdGenerator;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
+import org.exoplatform.services.security.IdentityConstants;
import org.picocontainer.Startable;
import java.io.IOException;
@@ -146,12 +146,14 @@
* @param dataManager
* @param config
*/
- public LockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry
config)
+ public LockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry
config,
+ LockRemoverHolder lockRemoverHolder)
{
- this(dataManager, config, null);
+ this(dataManager, config, null, lockRemoverHolder);
}
- public LockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry
config, LockPersister persister)
+ public LockManagerImpl(WorkspacePersistentDataManager dataManager, WorkspaceEntry
config, LockPersister persister,
+ LockRemoverHolder lockRemoverHolder)
{
this.dataManager = dataManager;
@@ -169,6 +171,7 @@
tokensMap = new HashMap<String, LockData>();
dataManager.addItemPersistenceListener(this);
+ lockRemover = lockRemoverHolder.getLockRemover(this);
}
public synchronized void addLockToken(String sessionId, String lt)
@@ -468,7 +471,7 @@
*/
public void start()
{
- lockRemover = new LockRemover(this);
+ lockRemover.start();
}
// Quick method. We need to reconstruct
@@ -503,8 +506,8 @@
*/
public void stop()
{
- lockRemover.halt();
- lockRemover.interrupt();
+ lockRemover.stop();
+
locks.clear();
pendingLocks.clear();
tokensMap.clear();
@@ -701,7 +704,7 @@
{
NodeData nData = (NodeData)dataManager.getItemData(nodeIdentifier);
PlainChangesLog changesLog =
- new PlainChangesLogImpl(new ArrayList<ItemState>(),
SystemIdentity.SYSTEM, ExtendedEvent.UNLOCK);
+ new PlainChangesLogImpl(new ArrayList<ItemState>(),
IdentityConstants.SYSTEM, ExtendedEvent.UNLOCK);
ItemData lockOwner =
copyItemData((PropertyData)dataManager.getItemData(nData, new
QPathEntry(Constants.JCR_LOCKOWNER, 1),
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemover.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -18,47 +18,68 @@
*/
package org.exoplatform.services.jcr.impl.core.lock;
-import org.exoplatform.services.jcr.impl.proccess.WorkerThread;
-import org.exoplatform.services.log.ExoLogger;
-import org.exoplatform.services.log.Log;
+import org.exoplatform.services.jcr.impl.proccess.WorkerService;
+import java.util.concurrent.ScheduledFuture;
+
/**
* Created by The eXo Platform SAS.
*
* @author <a href="mailto:Sergey.Kabashnyuk@gmail.com">Sergey
Kabashnyuk</a>
* @version $Id: LockRemover.java 11987 2008-03-17 09:06:06Z ksm $
*/
-public class LockRemover extends WorkerThread
+public class LockRemover
{
+ public static final long DEFAULT_THREAD_TIMEOUT = 30000; // 30 sec
- private final Log log =
ExoLogger.getLogger("exo.jcr.component.core.LockRemover");
+ private final WorkerService workerService;
- public static final long DEFAULT_THREAD_TIMEOUT = 30000; // 30
+ private final WorkspaceLockManager lockManager;
- // sec
+ private final long timeout;
- private final WorkspaceLockManager lockManagerImpl;
+ private ScheduledFuture lockRemoverTask = null;
- public LockRemover(WorkspaceLockManager lockManagerImpl)
+ class LockRemoverTask implements Runnable
{
- this(lockManagerImpl, DEFAULT_THREAD_TIMEOUT);
+ private final WorkspaceLockManager lockManager;
+
+ LockRemoverTask(WorkspaceLockManager lockManager)
+ {
+ this.lockManager = lockManager;
+ }
+
+ public void run()
+ {
+ lockManager.removeExpired();
+ }
}
- private LockRemover(WorkspaceLockManager lockManagerImpl, long timeout)
+ protected LockRemover(WorkerService workerService, WorkspaceLockManager lockManager)
{
- super(timeout);
- this.lockManagerImpl = lockManagerImpl;
- setName("LockRemover " + getId());
- setPriority(Thread.MIN_PRIORITY);
- setDaemon(true);
- start();
- if (log.isDebugEnabled())
- log.debug("LockRemover instantiated name= " + getName() + "
timeout= " + timeout);
+ this(workerService, lockManager, DEFAULT_THREAD_TIMEOUT);
}
- @Override
- protected void callPeriodically() throws Exception
+ protected LockRemover(WorkerService workerService, WorkspaceLockManager lockManager,
long timeout)
{
- lockManagerImpl.removeExpired();
+ this.workerService = workerService;
+ this.lockManager = lockManager;
+ this.timeout = timeout;
}
+
+ public void start()
+ {
+ if (lockRemoverTask != null)
+ {
+ stop();
+ }
+ lockRemoverTask = workerService.executePeriodically(new
LockRemoverTask(lockManager), timeout);
+ }
+
+ public void stop()
+ {
+ lockRemoverTask.cancel(false);
+ lockRemoverTask = null;
+ }
+
}
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemoverHolder.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemoverHolder.java
(rev 0)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/LockRemoverHolder.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -0,0 +1,65 @@
+package org.exoplatform.services.jcr.impl.core.lock;
+
+import org.exoplatform.services.jcr.config.RepositoryEntry;
+import org.exoplatform.services.jcr.impl.proccess.WorkerService;
+
+/**
+ * LockRemoverHolder holds is a single per-repository LockRemover container.
+ * @author <a href="mailto:foo@bar.org">Foo Bar</a>
+ * @version $Id: exo-jboss-codetemplates.xml 34360 2009-07-22 23:58:59Z aheritier $
+ *
+ */
+public class LockRemoverHolder
+{
+
+ /**
+ * Default amount of thread that may be used by WorkerService to serve LockRemovers.
+ */
+ public final int DEFAULT_THREAD_COUNT = 1;
+
+ /**
+ * WorkerService that executed LockRemover.
+ */
+ private final WorkerService workerService;
+
+ /**
+ * Constructor.
+ * @param entry - RepositoryEntry that may contain lock-remover-max-threads
parameter.
+ */
+ public LockRemoverHolder(RepositoryEntry entry)
+ {
+ int threadCount = DEFAULT_THREAD_COUNT;
+ if (entry != null)
+ {
+ if (entry.getLockRemoverThreadsCount() > 0)
+ {
+ threadCount = entry.getLockRemoverThreadsCount();
+ }
+ }
+ workerService = new WorkerService(threadCount, "lock-remover");
+ }
+
+ /**
+ * Returns LockRemover object that removes expired locks from LockManager. Default
timeout used.
+ *
+ * @param lockManager - LockManager that going to be cleaned with returned
LockRemover.
+ * @return LockRemover
+ */
+ public LockRemover getLockRemover(WorkspaceLockManager lockManager)
+ {
+ return new LockRemover(workerService, lockManager);
+ }
+
+ /**
+ * Returns LockRemover object that removes expired locks from LockManager.
+ *
+ * @param lockManager - LockManager that going to be cleaned with returned
LockRemover.
+ * @param timeout - LockRemover will check LockManager with delay setted in timeout
parameter
+ * @return LockRemover
+ */
+ public LockRemover getLockRemover(WorkspaceLockManager lockManager, long timeout)
+ {
+ return new LockRemover(workerService, lockManager, timeout);
+ }
+
+}
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/CacheableLockManagerImpl.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -21,7 +21,6 @@
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
-import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.config.MappedParametrizedObjectEntry;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
@@ -43,6 +42,7 @@
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.core.lock.LockRemover;
+import org.exoplatform.services.jcr.impl.core.lock.LockRemoverHolder;
import org.exoplatform.services.jcr.impl.core.lock.SessionLockManager;
import org.exoplatform.services.jcr.impl.dataflow.TransientItemData;
import org.exoplatform.services.jcr.impl.dataflow.TransientPropertyData;
@@ -57,6 +57,7 @@
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.naming.InitialContextInitializer;
+import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.services.transaction.TransactionService;
import org.jboss.cache.Cache;
import org.jboss.cache.CacheSPI;
@@ -173,7 +174,7 @@
private Cache<Serializable, Object> cache;
private final Fqn<String> lockRoot;
-
+
private final boolean shareable;
/**
@@ -192,10 +193,10 @@
* @throws RepositoryConfigurationException
*/
public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, TransactionService transactionService,
ConfigurationManager cfm)
- throws RepositoryConfigurationException, RepositoryException
+ InitialContextInitializer context, TransactionService transactionService,
ConfigurationManager cfm,
+ LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException,
RepositoryException
{
- this(dataManager, config, context, transactionService.getTransactionManager(),
cfm);
+ this(dataManager, config, context, transactionService.getTransactionManager(), cfm,
lockRemoverHolder);
}
/**
@@ -207,10 +208,10 @@
* @throws RepositoryConfigurationException
*/
public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, ConfigurationManager cfm) throws
RepositoryConfigurationException,
- RepositoryException
+ InitialContextInitializer context, ConfigurationManager cfm, LockRemoverHolder
lockRemoverHolder)
+ throws RepositoryConfigurationException, RepositoryException
{
- this(dataManager, config, context, (TransactionManager)null, cfm);
+ this(dataManager, config, context, (TransactionManager)null, cfm,
lockRemoverHolder);
}
@@ -225,8 +226,8 @@
* @throws RepositoryConfigurationException
*/
public CacheableLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, TransactionManager transactionManager,
ConfigurationManager cfm)
- throws RepositoryConfigurationException, RepositoryException
+ InitialContextInitializer context, TransactionManager transactionManager,
ConfigurationManager cfm,
+ LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException,
RepositoryException
{
lockRoot = Fqn.fromElements(config.getUniqueName(), LOCKS);
@@ -270,7 +271,7 @@
cache = factory.createCache(config.getLockManager());
Fqn<String> rootFqn = Fqn.fromElements(config.getUniqueName());
-
+
shareable =
config.getLockManager().getParameterBoolean(JBOSSCACHE_SHAREABLE,
JBOSSCACHE_SHAREABLE_DEFAULT)
.booleanValue();
@@ -292,6 +293,8 @@
{
throw new RepositoryConfigurationException("Cache configuration not
found");
}
+
+ lockRemover = lockRemoverHolder.getLockRemover(this);
}
/**
@@ -819,7 +822,7 @@
*/
public void start()
{
- lockRemover = new LockRemover(this);
+ lockRemover.start();
}
/*
@@ -828,17 +831,17 @@
*/
public void stop()
{
- lockRemover.halt();
- lockRemover.interrupt();
+ lockRemover.stop();
+
sessionLockManagers.clear();
if (shareable)
{
// The cache cannot be stopped since it can be shared so we evict the root node
instead
- cache.evict(lockRoot);
+ cache.evict(lockRoot);
}
else
{
- PrivilegedCacheHelper.stop(cache);
+ PrivilegedCacheHelper.stop(cache);
}
}
@@ -1112,7 +1115,7 @@
}
PlainChangesLog changesLog =
- new PlainChangesLogImpl(new ArrayList<ItemState>(),
SystemIdentity.SYSTEM, ExtendedEvent.UNLOCK);
+ new PlainChangesLogImpl(new ArrayList<ItemState>(),
IdentityConstants.SYSTEM, ExtendedEvent.UNLOCK);
ItemData lockOwner =
copyItemData((PropertyData)dataManager.getItemData(nData, new
QPathEntry(Constants.JCR_LOCKOWNER, 1),
Modified:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/jdbc/CacheableJDBCLockManagerImpl.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/jdbc/CacheableJDBCLockManagerImpl.java 2010-10-22
08:11:26 UTC (rev 3333)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/core/lock/jbosscache/jdbc/CacheableJDBCLockManagerImpl.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -21,7 +21,6 @@
import org.exoplatform.management.annotations.ManagedDescription;
import org.exoplatform.management.jmx.annotations.NameTemplate;
import org.exoplatform.management.jmx.annotations.Property;
-import org.exoplatform.services.jcr.access.SystemIdentity;
import org.exoplatform.services.jcr.config.RepositoryConfigurationException;
import org.exoplatform.services.jcr.config.SimpleParameterEntry;
import org.exoplatform.services.jcr.config.WorkspaceEntry;
@@ -42,6 +41,7 @@
import org.exoplatform.services.jcr.impl.Constants;
import org.exoplatform.services.jcr.impl.core.SessionDataManager;
import org.exoplatform.services.jcr.impl.core.lock.LockRemover;
+import org.exoplatform.services.jcr.impl.core.lock.LockRemoverHolder;
import org.exoplatform.services.jcr.impl.core.lock.SessionLockManager;
import org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableLockManager;
import
org.exoplatform.services.jcr.impl.core.lock.jbosscache.CacheableSessionLockManager;
@@ -55,6 +55,7 @@
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.services.naming.InitialContextInitializer;
+import org.exoplatform.services.security.IdentityConstants;
import org.exoplatform.services.transaction.TransactionService;
import org.jboss.cache.Cache;
import org.jboss.cache.Fqn;
@@ -161,10 +162,10 @@
* @throws RepositoryConfigurationException
*/
public CacheableJDBCLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, TransactionService transactionService,
ConfigurationManager cfm)
- throws RepositoryConfigurationException, RepositoryException
+ InitialContextInitializer context, TransactionService transactionService,
ConfigurationManager cfm,
+ LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException,
RepositoryException
{
- this(dataManager, config, context, transactionService.getTransactionManager(),
cfm);
+ this(dataManager, config, context, transactionService.getTransactionManager(), cfm,
lockRemoverHolder);
}
/**
@@ -176,10 +177,10 @@
* @throws RepositoryConfigurationException
*/
public CacheableJDBCLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, ConfigurationManager cfm) throws
RepositoryConfigurationException,
- RepositoryException
+ InitialContextInitializer context, ConfigurationManager cfm, LockRemoverHolder
lockRemoverHolder)
+ throws RepositoryConfigurationException, RepositoryException
{
- this(dataManager, config, context, (TransactionManager)null, cfm);
+ this(dataManager, config, context, (TransactionManager)null, cfm,
lockRemoverHolder);
}
/**
@@ -194,8 +195,8 @@
* @throws RepositoryException
*/
public CacheableJDBCLockManagerImpl(WorkspacePersistentDataManager dataManager,
WorkspaceEntry config,
- InitialContextInitializer context, TransactionManager transactionManager,
ConfigurationManager cfm)
- throws RepositoryConfigurationException, RepositoryException
+ InitialContextInitializer context, TransactionManager transactionManager,
ConfigurationManager cfm,
+ LockRemoverHolder lockRemoverHolder) throws RepositoryConfigurationException,
RepositoryException
{
lockRoot = Fqn.fromElements(LOCKS);
@@ -250,6 +251,8 @@
{
throw new RepositoryConfigurationException("Cache configuration not
found");
}
+
+ lockRemover = lockRemoverHolder.getLockRemover(this);
}
@Managed
@@ -598,7 +601,7 @@
*/
public void start()
{
- lockRemover = new LockRemover(this);
+ lockRemover.start();
}
/**
@@ -606,8 +609,8 @@
*/
public void stop()
{
- lockRemover.halt();
- lockRemover.interrupt();
+ lockRemover.stop();
+
sessionLockManagers.clear();
cache.stop();
}
@@ -947,7 +950,7 @@
}
PlainChangesLog changesLog =
- new PlainChangesLogImpl(new ArrayList<ItemState>(),
SystemIdentity.SYSTEM, ExtendedEvent.UNLOCK);
+ new PlainChangesLogImpl(new ArrayList<ItemState>(),
IdentityConstants.SYSTEM, ExtendedEvent.UNLOCK);
ItemData lockOwner =
copyItemData((PropertyData)dataManager.getItemData(nData, new
QPathEntry(Constants.JCR_LOCKOWNER, 1),
Added:
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/proccess/WorkerService.java
===================================================================
---
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/proccess/WorkerService.java
(rev 0)
+++
jcr/trunk/exo.jcr.component.core/src/main/java/org/exoplatform/services/jcr/impl/proccess/WorkerService.java 2010-10-22
09:08:28 UTC (rev 3334)
@@ -0,0 +1,84 @@
+package org.exoplatform.services.jcr.impl.proccess;
+
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+public class WorkerService
+{
+ /**
+ * Executor that process assigned command periodically.
+ */
+ private final ScheduledThreadPoolExecutor executor;
+
+ class WorkerThreadFactory implements ThreadFactory
+ {
+ final AtomicInteger poolNumber = new AtomicInteger(1);
+
+ final ThreadGroup group;
+
+ final AtomicInteger threadNumber = new AtomicInteger(1);
+
+ final String namePrefix;
+
+ WorkerThreadFactory(String namePrefix)
+ {
+ SecurityManager s = System.getSecurityManager();
+ group = (s != null) ? s.getThreadGroup() :
Thread.currentThread().getThreadGroup();
+ this.namePrefix = namePrefix + poolNumber.getAndIncrement() +
"-thread-";
+ }
+
+ public Thread newThread(Runnable r)
+ {
+ Thread t = new Thread(group, r, namePrefix + threadNumber.getAndIncrement(),
0);
+ if (t.isDaemon())
+ t.setDaemon(false);
+ if (t.getPriority() != Thread.NORM_PRIORITY)
+ t.setPriority(Thread.NORM_PRIORITY);
+ return t;
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param threadCount - max thread count that executor may use
+ */
+ public WorkerService(int threadCount)
+ {
+ executor = new ScheduledThreadPoolExecutor(threadCount);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param threadCount - max thread count that executor may use
+ * @param threadNamePrefix - thread name prefix
+ */
+ public WorkerService(int threadCount, String threadNamePrefix)
+ {
+ executor = new ScheduledThreadPoolExecutor(threadCount, new
WorkerThreadFactory(threadNamePrefix));
+ }
+
+ /**
+ * Execute specified <code>command</code> periodically with
<code>delay</code>.
+ *
+ * @param command - command that must be executed
+ * @param delay - delay between each command execution
+ * @return
+ */
+ public ScheduledFuture executePeriodically(Runnable command, long delay)
+ {
+ return executor.scheduleWithFixedDelay(command, 0, delay, TimeUnit.MILLISECONDS);
+ }
+
+ /**
+ * Initiates an orderly shutdown in which previously submitted tasks are executed, but
no new tasks will be accepted.
+ */
+ public void stop()
+ {
+ executor.shutdown();
+ }
+}
Modified: jcr/trunk/exo.jcr.component.core/src/main/resources/binding.xml
===================================================================
--- jcr/trunk/exo.jcr.component.core/src/main/resources/binding.xml 2010-10-22 08:11:26
UTC (rev 3333)
+++ jcr/trunk/exo.jcr.component.core/src/main/resources/binding.xml 2010-10-22 09:08:28
UTC (rev 3334)
@@ -17,6 +17,8 @@
<value name="access-control" field="accessControl"
usage="optional" />
<value name="session-max-age" field="sessionTimeOut"
deserializer="org.exoplatform.services.jcr.util.ConfigurationFormat.parseTime"
usage="optional" />
+ <value name="lock-remover-max-threads"
field="lockRemoverMaxThreadCount"
+
deserializer="org.exoplatform.services.jcr.util.ConfigurationFormat.parseInt"
usage="optional" />
<value name="authentication-policy"
field="authenticationPolicy" />
<collection name="workspaces" field="workspaces"
item-type="org.exoplatform.services.jcr.config.WorkspaceEntry" />
</mapping>