You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2014/08/13 21:38:48 UTC
svn commit: r1617816 -
/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
Author: doogie
Date: Wed Aug 13 19:38:48 2014
New Revision: 1617816
URL: http://svn.apache.org/r1617816
Log:
Now that the thread-pool startup dead-locks are fixed, we can configure
the entirety of the delegator in a thread pool. This will become a big
win very shortly, when multiple delegators are created at startup.
Modified:
ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java?rev=1617816&r1=1617815&r2=1617816&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java Wed Aug 13 19:38:48 2014
@@ -18,7 +18,14 @@
*/
package org.ofbiz.entity;
+import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.ScheduledExecutorService;
+
+import org.ofbiz.base.concurrent.ExecutionPool;
import org.ofbiz.base.lang.Factory;
import org.ofbiz.base.util.Debug;
@@ -27,33 +34,65 @@ import org.ofbiz.base.util.UtilObject;
/** <code>Delegator</code> factory abstract class. */
public abstract class DelegatorFactory implements Factory<Delegator, String> {
public static final String module = DelegatorFactoryImpl.class.getName();
- private static final ConcurrentHashMap<String, Delegator> delegatorCache = new ConcurrentHashMap<String, Delegator>();
+ private static final ConcurrentHashMap<String, Future<Delegator>> delegators = new ConcurrentHashMap<String, Future<Delegator>>();
+ private static final ThreadGroup DELEGATOR_THREAD_GROUP = new ThreadGroup("DelegatorFactory");
+ private static final ScheduledExecutorService executor = ExecutionPool.getExecutor(DELEGATOR_THREAD_GROUP, "delegator-startup", -1, true);
public static Delegator getDelegator(String delegatorName) {
+ Future<Delegator> future = getDelegatorFuture(delegatorName);
+ try {
+ return future.get();
+ } catch (ExecutionException e) {
+ Debug.logError(e, module);
+ return null;
+ } catch (InterruptedException e) {
+ Debug.logError(e, module);
+ return null;
+ }
+ }
+
+ public static Future<Delegator> getDelegatorFuture(String delegatorName) {
if (delegatorName == null) {
delegatorName = "default";
//Debug.logWarning(new Exception("Location where getting delegator with null name"), "Got a getGenericDelegator call with a null delegatorName, assuming default for the name.", module);
}
do {
- Delegator delegator = delegatorCache.get(delegatorName);
+ Future<Delegator> future = delegators.get(delegatorName);
+ if (future != null) {
+ //Debug.logInfo("got delegator(future(" + delegatorName + ")) from cache", module);
+ return future;
+ }
+ FutureTask<Delegator> futureTask = new FutureTask<Delegator>(new DelegatorConfigurable(delegatorName));
+ //Debug.logInfo("putting delegator(future(" + delegatorName + ")) into cache", module);
+ if (delegators.putIfAbsent(delegatorName, futureTask) != null) {
+ continue;
+ }
+ executor.submit(futureTask);
+ } while (true);
+ }
+
+ public static final class DelegatorConfigurable implements Callable<Delegator> {
+ private final String delegatorName;
+
+ public DelegatorConfigurable(String delegatorName) {
+ this.delegatorName = delegatorName;
+ }
+
+ public Delegator call() throws ClassNotFoundException {
+ try {
+ Delegator delegator = UtilObject.getObjectFromFactory(DelegatorFactory.class, delegatorName);
- if (delegator != null) {
// setup the Entity ECA Handler
delegator.initEntityEcaHandler();
- //Debug.logInfo("got delegator(" + delegatorName + ") from cache", module);
-
+
// setup the distributed CacheClear
delegator.initDistributedCacheClear();
return delegator;
- }
- try {
- delegator = UtilObject.getObjectFromFactory(DelegatorFactory.class, delegatorName);
} catch (ClassNotFoundException e) {
Debug.logError(e, module);
+ throw e;
}
- //Debug.logInfo("putting delegator(" + delegatorName + ") into cache", module);
- delegatorCache.putIfAbsent(delegatorName, delegator);
- } while (true);
+ }
}
}
Re: svn commit: r1617816 - /ofbiz/trunk/framework/entity/src/org/ofbiz/entity/DelegatorFactory.java
Posted by Jacopo Cappellato <ja...@hotwaxmedia.com>.
On Aug 13, 2014, at 9:38 PM, doogie@apache.org wrote:
> + private static final ScheduledExecutorService executor = ExecutionPool.getExecutor(DELEGATOR_THREAD_GROUP, "delegator-startup", -1, true);
I think the above one has been deprecated by one of your previous commits; I guess it should call getScheduledExecutor(...) method instead.
Jacopo