You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2015/03/23 15:55:48 UTC

svn commit: r1668659 - in /ofbiz/branches/release14.12: ./ framework/service/src/org/ofbiz/service/ServiceDispatcher.java specialpurpose/bi/config/bi.properties

Author: jacopoc
Date: Mon Mar 23 14:55:47 2015
New Revision: 1668659

URL: http://svn.apache.org/r1668659
Log:
Applied fix from trunk for revision: 1668657 
===

Fixed code to prevent that two or more threads at startup run the same startup services (defined in serviceengine.xml using the startup-service element) more than once.
This will also prevent a deadlock condition (similar to the one fixed with rev. 1655046) that could occur at bootstrap under certain conditions and unlucky timing.
Thanks to Deepak Dixit and Ravi Lodhi for the report, tests and feedback.


Modified:
    ofbiz/branches/release14.12/   (props changed)
    ofbiz/branches/release14.12/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
    ofbiz/branches/release14.12/specialpurpose/bi/config/bi.properties

Propchange: ofbiz/branches/release14.12/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Mon Mar 23 14:55:47 2015
@@ -8,4 +8,4 @@
 /ofbiz/branches/json-integration-refactoring:1634077-1635900
 /ofbiz/branches/multitenant20100310:921280-927264
 /ofbiz/branches/release13.07:1547657
-/ofbiz/trunk:1649072,1649083-1649084,1649086,1649090,1649096,1649230,1649238-1649239,1649248,1649272,1649275,1649280-1649281,1649283,1649285-1649286,1649291,1649329,1649331,1649384,1649393,1649666,1649742,1650240,1650348,1650357,1650583,1650642,1650678,1650821,1650882,1650887,1650938,1651593,1652312,1652361,1652638,1652641,1652672,1652688,1652706,1652725,1652731,1652739,1652852,1653248,1653296,1653456,1653597,1653614,1654175,1654273,1654509,1654670,1654672-1654673,1654683-1654684,1654824,1655046,1655668,1655979,1656014,1656185,1656198,1656445,1656983,1657323,1657506-1657507,1657514,1657714,1657790,1657848,1658364,1658662,1658882,1659224,1659965,1660031,1660053,1660389,1660444,1660579,1661303,1661328,1661760,1661778,1661853,1661862,1661873,1661940,1661951,1661977,1662119-1662120,1662361,1662500,1662812,1662919,1663202,1663912,1663979,1664602,1664604,1664696,1665154,1665162,1665535,1666404,1666511,1666633,1666836,1666939,1666949,1666958,1667055,1667253,1667483,1667492,1667774,1668207,
 1668214,1668236,1668246,1668258,1668263,1668265,1668270,1668277,1668314
+/ofbiz/trunk:1649072,1649083-1649084,1649086,1649090,1649096,1649230,1649238-1649239,1649248,1649272,1649275,1649280-1649281,1649283,1649285-1649286,1649291,1649329,1649331,1649384,1649393,1649666,1649742,1650240,1650348,1650357,1650583,1650642,1650678,1650821,1650882,1650887,1650938,1651593,1652312,1652361,1652638,1652641,1652672,1652688,1652706,1652725,1652731,1652739,1652852,1653248,1653296,1653456,1653597,1653614,1654175,1654273,1654509,1654670,1654672-1654673,1654683-1654684,1654824,1655046,1655668,1655979,1656014,1656185,1656198,1656445,1656983,1657323,1657506-1657507,1657514,1657714,1657790,1657848,1658364,1658662,1658882,1659224,1659965,1660031,1660053,1660389,1660444,1660579,1661303,1661328,1661760,1661778,1661853,1661862,1661873,1661940,1661951,1661977,1662119-1662120,1662361,1662500,1662812,1662919,1663202,1663912,1663979,1664602,1664604,1664696,1665154,1665162,1665535,1666404,1666511,1666633,1666836,1666939,1666949,1666958,1667055,1667253,1667483,1667492,1667774,1668207,
 1668214,1668236,1668246,1668258,1668263,1668265,1668270,1668277,1668314,1668657

Modified: ofbiz/branches/release14.12/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/framework/service/src/org/ofbiz/service/ServiceDispatcher.java?rev=1668659&r1=1668658&r2=1668659&view=diff
==============================================================================
--- ofbiz/branches/release14.12/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (original)
+++ ofbiz/branches/release14.12/framework/service/src/org/ofbiz/service/ServiceDispatcher.java Mon Mar 23 14:55:47 2015
@@ -85,7 +85,7 @@ public class ServiceDispatcher {
     protected JobManager jm = null;
     protected JmsListenerFactory jlf = null;
 
-    protected ServiceDispatcher(Delegator delegator, boolean enableJM, boolean enableJMS, boolean enableSvcs) {
+    protected ServiceDispatcher(Delegator delegator, boolean enableJM, boolean enableJMS) {
         factory = new GenericEngineFactory(this);
         ServiceGroupReader.readConfig();
         ServiceEcaUtil.readConfig();
@@ -127,14 +127,10 @@ public class ServiceDispatcher {
         if (enableJMS) {
             this.jlf = JmsListenerFactory.getInstance(delegator);
         }
-
-        if (enableSvcs) {
-            this.runStartupServices();
-        }
     }
 
     protected ServiceDispatcher(Delegator delegator) {
-        this(delegator, enableJM, enableJMS, enableSvcs);
+        this(delegator, enableJM, enableJMS);
     }
 
     /**
@@ -167,8 +163,15 @@ public class ServiceDispatcher {
             if (Debug.verboseOn())
                 Debug.logVerbose("[ServiceDispatcher.getInstance] : No instance found (" + dispatcherKey + ").", module);
             sd = new ServiceDispatcher(delegator);
-            dispatchers.putIfAbsent(dispatcherKey, sd);
-            sd = dispatchers.get(dispatcherKey);
+            ServiceDispatcher cachedDispatcher = dispatchers.putIfAbsent(dispatcherKey, sd);
+            if (cachedDispatcher == null) {
+                // if the cachedDispatcher is null, then it means that
+                // the new dispatcher created by this thread was successfully added to the cache
+                // only in this case, the thread runs runStartupServices
+                sd.runStartupServices();
+                cachedDispatcher = sd;
+            }
+            sd = cachedDispatcher;
         }
         return sd;
     }
@@ -981,8 +984,9 @@ public class ServiceDispatcher {
 
     // run startup services
     private synchronized int runStartupServices() {
-        if (jm == null)
+        if (!enableSvcs || jm == null) {
             return 0;
+        }
         int servicesScheduled = 0;
         List<StartupService> startupServices = null;
         try {

Modified: ofbiz/branches/release14.12/specialpurpose/bi/config/bi.properties
URL: http://svn.apache.org/viewvc/ofbiz/branches/release14.12/specialpurpose/bi/config/bi.properties?rev=1668659&r1=1668658&r2=1668659&view=diff
==============================================================================
--- ofbiz/branches/release14.12/specialpurpose/bi/config/bi.properties (original)
+++ ofbiz/branches/release14.12/specialpurpose/bi/config/bi.properties Mon Mar 23 14:55:47 2015
@@ -1,2 +1,20 @@
+###############################################################################
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+###############################################################################
 fromDate=2013-09-01
 thruDate=2023-09-01
\ No newline at end of file