You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2013/06/08 13:55:12 UTC

svn commit: r1490965 - in /ofbiz/trunk/framework/entity/src/org/ofbiz/entity: config/EntityConfigListener.java config/EntityConfigUtil.java jdbc/ConnectionFactory.java transaction/TransactionFactory.java

Author: adrianc
Date: Sat Jun  8 11:55:12 2013
New Revision: 1490965

URL: http://svn.apache.org/r1490965
Log:
Removed some code I introduced in recent commits where I was hoping to support reloading the entityengine.xml file in a controlled manor, but it seems to be causing thread deadlocks.

https://issues.apache.org/jira/browse/OFBIZ-5216

Removed:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigListener.java
Modified:
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigUtil.java
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/ConnectionFactory.java
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionFactory.java

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigUtil.java?rev=1490965&r1=1490964&r2=1490965&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigUtil.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/EntityConfigUtil.java Sat Jun  8 11:55:12 2013
@@ -19,16 +19,14 @@
 package org.ofbiz.entity.config;
 
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilProperties;
 import org.ofbiz.base.util.UtilURL;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilXml;
-import org.ofbiz.base.util.cache.UtilCache;
 import org.ofbiz.entity.GenericEntityConfException;
 import org.ofbiz.entity.config.model.Datasource;
 import org.ofbiz.entity.config.model.DelegatorElement;
@@ -40,8 +38,6 @@ import org.ofbiz.entity.config.model.Ent
 import org.ofbiz.entity.config.model.FieldType;
 import org.ofbiz.entity.config.model.InlineJdbc;
 import org.ofbiz.entity.config.model.ResourceLoader;
-import org.ofbiz.entity.jdbc.ConnectionFactory;
-import org.ofbiz.entity.transaction.TransactionFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
@@ -53,8 +49,7 @@ public final class EntityConfigUtil {
 
     public static final String module = EntityConfigUtil.class.getName();
     public static final String ENTITY_ENGINE_XML_FILENAME = "entityengine.xml";
-    // Keep the EntityConfig instance in a cache - so the configuration can be reloaded at run-time. There will be only one EntityConfig instance in the cache.
-    private static final UtilCache<String, EntityConfig> entityConfigCache = UtilCache.createUtilCache("entity.EntityConfig", 0, 0, false);
+    private static final AtomicReference<EntityConfig> configRef = new AtomicReference<EntityConfig>(null);
 
     public static String createConfigFileLineNumberText(Element element) {
         if (element.getUserData("startLine") != null) {
@@ -68,23 +63,12 @@ public final class EntityConfigUtil {
      * @throws GenericEntityConfException
      */
     public static EntityConfig getEntityConfig() throws GenericEntityConfException {
-        EntityConfig instance = entityConfigCache.get("instance");
+        EntityConfig instance = configRef.get();
         if (instance == null) {
-            synchronized (EntityConfigUtil.class) {
-                // Sync ensures resources are initialized properly - do not remove.
-                Element entityConfigElement = getXmlDocument().getDocumentElement();
-                instance = new EntityConfig(entityConfigElement);
-                EntityConfig previousInstance = entityConfigCache.putIfAbsent("instance", instance);
-                instance = entityConfigCache.get("instance");
-                if (previousInstance == null) {
-                    for (EntityConfigListener listener : getConfigListeners()) {
-                        try {
-                            listener.onEntityConfigChange(instance);
-                        } catch (Exception e) {
-                            Debug.logError(e, "Exception thrown while notifying listener " + listener + ": ", module);
-                        }
-                    }
-                }
+            Element entityConfigElement = getXmlDocument().getDocumentElement();
+            instance = new EntityConfig(entityConfigElement);
+            if (!configRef.compareAndSet(null, instance)) {
+                instance = configRef.get();
             }
         }
         return instance;
@@ -102,15 +86,6 @@ public final class EntityConfigUtil {
         }
     }
 
-    private static List<EntityConfigListener> getConfigListeners() {
-        // TODO: Build a list of listeners. Listeners must be notified in a specific order
-        // so resources can be deallocated/allocated properly and so dependencies can be followed.
-        List<EntityConfigListener> configListeners = new ArrayList<EntityConfigListener>();
-        configListeners.add(TransactionFactory.getConfigListener());
-        configListeners.add(ConnectionFactory.getConfigListener());
-        return configListeners;
-    }
-
     public static String getTxFactoryClass() throws GenericEntityConfException {
         return getEntityConfig().getTransactionFactory().getClassName();
     }

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/ConnectionFactory.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/ConnectionFactory.java?rev=1490965&r1=1490964&r2=1490965&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/ConnectionFactory.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/ConnectionFactory.java Sat Jun  8 11:55:12 2013
@@ -28,9 +28,7 @@ import java.util.concurrent.atomic.Atomi
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.GenericEntityException;
-import org.ofbiz.entity.config.EntityConfigListener;
 import org.ofbiz.entity.config.EntityConfigUtil;
-import org.ofbiz.entity.config.model.EntityConfig;
 import org.ofbiz.entity.config.model.JdbcElement;
 import org.ofbiz.entity.connection.ConnectionFactoryInterface;
 import org.ofbiz.entity.datasource.GenericHelperInfo;
@@ -44,22 +42,6 @@ public class ConnectionFactory {
     // Debug module name
     public static final String module = ConnectionFactory.class.getName();
     private static final AtomicReference<ConnectionFactoryInterface> connFactoryRef = new AtomicReference<ConnectionFactoryInterface>(null);
-    private static final EntityConfigListener configListener = new EntityConfigListener() {
-        @Override
-        public void onEntityConfigChange(EntityConfig entityConfig) throws Exception {
-            ConnectionFactoryInterface instance = createConnectionFactoryInterface();
-            ConnectionFactoryInterface previousInstance = connFactoryRef.getAndSet(instance);
-            if (previousInstance != null) {
-                previousInstance.closeAll();
-                Debug.logInfo("Listener shut down ConnectionFactoryInterface instance " + previousInstance, module);
-            }
-            Debug.logInfo("Listener created new ConnectionFactoryInterface instance " + instance, module);
-        }
-    };
-
-    public static EntityConfigListener getConfigListener() {
-        return configListener;
-    }
 
     private static ConnectionFactoryInterface createConnectionFactoryInterface() throws Exception {
         String className = EntityConfigUtil.getConnectionFactoryClass();
@@ -124,9 +106,7 @@ public class ConnectionFactory {
         if (instance == null) {
             try {
                 instance = createConnectionFactoryInterface();
-                if (connFactoryRef.compareAndSet(null, instance)) {
-                    Debug.logInfo("Factory method created new ConnectionFactoryInterface instance " + instance, module);
-                } else {
+                if (!connFactoryRef.compareAndSet(null, instance)) {
                     instance = connFactoryRef.get();
                 }
             } catch (Exception e) {

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionFactory.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionFactory.java?rev=1490965&r1=1490964&r2=1490965&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionFactory.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/TransactionFactory.java Sat Jun  8 11:55:12 2013
@@ -27,10 +27,8 @@ import javax.transaction.UserTransaction
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.entity.GenericEntityException;
-import org.ofbiz.entity.config.model.Datasource;
-import org.ofbiz.entity.config.EntityConfigListener;
 import org.ofbiz.entity.config.EntityConfigUtil;
-import org.ofbiz.entity.config.model.EntityConfig;
+import org.ofbiz.entity.config.model.Datasource;
 import org.ofbiz.entity.datasource.GenericHelperInfo;
 import org.ofbiz.entity.jdbc.CursorConnection;
 
@@ -41,22 +39,6 @@ public class TransactionFactory {
 
     public static final String module = TransactionFactory.class.getName();
     private static final AtomicReference<TransactionFactoryInterface> txFactoryRef = new AtomicReference<TransactionFactoryInterface>(null);
-    private static final EntityConfigListener configListener = new EntityConfigListener() {
-        @Override
-        public void onEntityConfigChange(EntityConfig entityConfig) throws Exception {
-            TransactionFactoryInterface instance = createTransactionFactoryInterface();
-            TransactionFactoryInterface previousInstance = txFactoryRef.getAndSet(instance);
-            if (previousInstance != null) {
-                previousInstance.shutdown();
-                Debug.logInfo("Listener shut down TransactionFactoryInterface instance " + previousInstance, module);
-            }
-            Debug.logInfo("Listener created new TransactionFactoryInterface instance " + instance, module);
-        }
-    };
-
-    public static EntityConfigListener getConfigListener() {
-        return configListener;
-    }
 
     private static TransactionFactoryInterface createTransactionFactoryInterface() throws Exception {
         String className = EntityConfigUtil.getTxFactoryClass();
@@ -73,9 +55,7 @@ public class TransactionFactory {
         if (instance == null) {
             try {
                 instance = createTransactionFactoryInterface();
-                if (txFactoryRef.compareAndSet(null, instance)) {
-                    Debug.logInfo("Factory method created new TransactionFactoryInterface instance " + instance, module);
-                } else {
+                if (!txFactoryRef.compareAndSet(null, instance)) {
                     instance = txFactoryRef.get();
                 }
             } catch (Exception e) {