Author: jacopoc
Date: Tue May 29 15:52:14 2012
New Revision: 1343792
URL: http://svn.apache.org/viewvc?rev=1343792&view=rev
Log:
Improved code that manages the cache:
* protected the UtilCache object (static field) by making it private and final
* removed unnecessary synchronization
Modified:
ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
Modified:
ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java?rev=1343792&r1=1343791&r2=1343792&view=diff
==============================================================================
--- ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
(original)
+++ ofbiz/trunk/framework/service/src/org/ofbiz/service/DispatchContext.java
Tue May 29 15:52:14 2012
@@ -59,7 +59,7 @@ public class DispatchContext implements
public static final String module = DispatchContext.class.getName();
protected static final String GLOBAL_KEY = "global.services";
- public static UtilCache<String, Map<String, ModelService>>
modelServiceMapByDispatcher =
UtilCache.createUtilCache("service.ModelServiceMapByDispatcher", 0, 0, false);
+ private static final UtilCache<String, Map<String, ModelService>>
modelServiceMapByDispatcher =
UtilCache.createUtilCache("service.ModelServiceMapByDispatcher", 0, 0, false);
protected transient LocalDispatcher dispatcher;
protected transient ClassLoader loader;
@@ -271,24 +271,19 @@ public class DispatchContext implements
private Map<String, ModelService> getLocalServiceMap() {
Map<String, ModelService> serviceMap =
modelServiceMapByDispatcher.get(name);
if (serviceMap == null) {
- synchronized (this) {
- serviceMap = modelServiceMapByDispatcher.get(name);
- if (serviceMap == null) {
- if (this.localReaders != null) {
- serviceMap = FastMap.newInstance();
- for (URL readerURL: this.localReaders) {
- Map<String, ModelService> readerServiceMap =
ModelServiceReader.getModelServiceMap(readerURL, this);
- if (readerServiceMap != null) {
- serviceMap.putAll(readerServiceMap);
- }
- }
- serviceMap = new HashMap<String,
ModelService>(serviceMap);
- }
- if (serviceMap != null) {
- modelServiceMapByDispatcher.put(name, serviceMap);
- // NOTE: the current ECA per dispatcher for local
services stuff is a bit broken, so now just doing this on the global def load:
ServiceEcaUtil.reloadConfig();
+ if (this.localReaders != null) {
+ serviceMap = FastMap.newInstance();
+ for (URL readerURL: this.localReaders) {
+ Map<String, ModelService> readerServiceMap =
ModelServiceReader.getModelServiceMap(readerURL, this);
+ if (readerServiceMap != null) {
+ serviceMap.putAll(readerServiceMap);
}
}
+ serviceMap = new HashMap<String, ModelService>(serviceMap);
+ }
+ if (serviceMap != null) {
+ serviceMap =
modelServiceMapByDispatcher.putIfAbsentAndGet(name, serviceMap);
+ // NOTE: the current ECA per dispatcher for local services
stuff is a bit broken, so now just doing this on the global def load:
ServiceEcaUtil.reloadConfig();
}
}
@@ -306,42 +301,39 @@ public class DispatchContext implements
private Map<String, ModelService> getGlobalServiceMap() {
Map<String, ModelService> serviceMap =
modelServiceMapByDispatcher.get(GLOBAL_KEY);
if (serviceMap == null) {
- synchronized (this) {
- serviceMap = modelServiceMapByDispatcher.get(GLOBAL_KEY);
- if (serviceMap == null) {
- serviceMap = FastMap.newInstance();
-
- Element rootElement;
-
- try {
- rootElement = ServiceConfigUtil.getXmlRootElement();
- } catch (GenericConfigException e) {
- Debug.logError(e, "Error getting Service Engine XML
root element", module);
- return null;
- }
+ serviceMap = FastMap.newInstance();
- List<Future<Map<String, ModelService>>> futures =
FastList.newInstance();
- for (Element globalServicesElement:
UtilXml.childElementList(rootElement, "global-services")) {
- ResourceHandler handler = new MainResourceHandler(
- ServiceConfigUtil.SERVICE_ENGINE_XML_FILENAME,
globalServicesElement);
+ Element rootElement;
-
futures.add(ExecutionPool.GLOBAL_EXECUTOR.submit(createServiceReaderCallable(handler)));
- }
+ try {
+ rootElement = ServiceConfigUtil.getXmlRootElement();
+ } catch (GenericConfigException e) {
+ Debug.logError(e, "Error getting Service Engine XML root
element", module);
+ return null;
+ }
- // get all of the component resource model stuff, ie
specified in each ofbiz-component.xml file
- for (ComponentConfig.ServiceResourceInfo
componentResourceInfo: ComponentConfig.getAllServiceResourceInfos("model")) {
-
futures.add(ExecutionPool.GLOBAL_EXECUTOR.submit(createServiceReaderCallable(componentResourceInfo.createResourceHandler())));
- }
- for (Map<String, ModelService> servicesMap:
ExecutionPool.getAllFutures(futures)) {
- if (servicesMap != null) {
- serviceMap.putAll(servicesMap);
- }
- }
+ List<Future<Map<String, ModelService>>> futures =
FastList.newInstance();
+ for (Element globalServicesElement:
UtilXml.childElementList(rootElement, "global-services")) {
+ ResourceHandler handler = new MainResourceHandler(
+ ServiceConfigUtil.SERVICE_ENGINE_XML_FILENAME,
globalServicesElement);
- if (serviceMap != null) {
- modelServiceMapByDispatcher.put(GLOBAL_KEY,
serviceMap);
- ServiceEcaUtil.reloadConfig();
- }
+
futures.add(ExecutionPool.GLOBAL_EXECUTOR.submit(createServiceReaderCallable(handler)));
+ }
+
+ // get all of the component resource model stuff, ie specified in
each ofbiz-component.xml file
+ for (ComponentConfig.ServiceResourceInfo componentResourceInfo:
ComponentConfig.getAllServiceResourceInfos("model")) {
+
futures.add(ExecutionPool.GLOBAL_EXECUTOR.submit(createServiceReaderCallable(componentResourceInfo.createResourceHandler())));
+ }
+ for (Map<String, ModelService> servicesMap:
ExecutionPool.getAllFutures(futures)) {
+ if (servicesMap != null) {
+ serviceMap.putAll(servicesMap);
+ }
+ }
+
+ if (serviceMap != null) {
+ Map<String, ModelService> cachedServiceMap =
modelServiceMapByDispatcher.putIfAbsentAndGet(GLOBAL_KEY, serviceMap);
+ if (cachedServiceMap == serviceMap) { // same object: this
means that the object created by this thread was actually added to the cache
+ ServiceEcaUtil.reloadConfig();
}
}
}