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 2011/06/30 01:10:02 UTC

svn commit: r1141318 - /ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java

Author: doogie
Date: Wed Jun 29 23:10:01 2011
New Revision: 1141318

URL: http://svn.apache.org/viewvc?rev=1141318&view=rev
Log:
FEATURE: Load each configured catalina web context in parallel.

Modified:
    ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java

Modified: ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1141318&r1=1141317&r2=1141318&view=diff
==============================================================================
--- ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java (original)
+++ ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java Wed Jun 29 23:10:01 2011
@@ -25,6 +25,9 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
 
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
@@ -60,6 +63,7 @@ import org.apache.catalina.valves.Reques
 import org.apache.coyote.ProtocolHandler;
 import org.apache.coyote.http11.Http11Protocol;
 import org.ofbiz.base.component.ComponentConfig;
+import org.ofbiz.base.concurrent.ExecutionPool;
 import org.ofbiz.base.container.ClassLoaderContainer;
 import org.ofbiz.base.container.Container;
 import org.ofbiz.base.container.ContainerConfig;
@@ -136,6 +140,7 @@ public class CatalinaContainer implement
     public static final String J2EE_APP = "OFBiz";
     public static final String module = CatalinaContainer.class.getName();
     protected static Map<String, String> mimeTypes = new HashMap<String, String>();
+    private static final ThreadGroup CATALINA_THREAD_GROUP = new ThreadGroup("CatalinaContainer");
 
     // load the JSSE propertes (set the trust store)
     static {
@@ -361,13 +366,15 @@ public class CatalinaContainer implement
     }
 
     protected Host createHost(Engine engine, String hostName) throws ContainerException {
+        Debug.logInfo("createHost(" + engine + ", " + hostName + ")", module);
         if (embedded == null) {
             throw new ContainerException("Cannot create Host without Embedded instance!");
         }
 
         Host host = embedded.createHost(hostName, CATALINA_HOSTS_HOME);
-        host.setDeployOnStartup(true);
-        host.setAutoDeploy(true);
+        host.setDeployOnStartup(false);
+        host.setBackgroundProcessorDelay(5);
+        host.setAutoDeploy(false);
         host.setRealm(engine.getRealm());
         engine.addChild(host);
         hosts.put(engine.getName() + hostName, host);
@@ -499,14 +506,15 @@ public class CatalinaContainer implement
         return connector;
     }
 
-    protected Context createContext(ComponentConfig.WebappInfo appInfo) throws ContainerException {
-        Engine engine = engines.get(appInfo.server);
+    protected Callable<Context> createContext(final ComponentConfig.WebappInfo appInfo) throws ContainerException {
+        Debug.logInfo("createContext(" + appInfo + ")", module);
+        final Engine engine = engines.get(appInfo.server);
         if (engine == null) {
             Debug.logWarning("Server with name [" + appInfo.server + "] not found; not mounting [" + appInfo.name + "]", module);
             return null;
         }
         List<String> virtualHosts = appInfo.getVirtualHosts();
-        Host host;
+        final Host host;
         if (UtilValidate.isEmpty(virtualHosts)) {
             host = hosts.get(engine.getName() + "._DEFAULT");
         } else {
@@ -515,8 +523,9 @@ public class CatalinaContainer implement
             String hostName = vhi.next();
 
             boolean newHost = false;
-            host = hosts.get(engine.getName() + "." + hostName);
-            if (host == null) {
+            if (hosts.containsKey(engine.getName() + "." + hostName)) {
+                host = hosts.get(engine.getName() + "." + hostName);
+            } else {
                 host = createHost(engine, hostName);
                 newHost = true;
             }
@@ -529,10 +538,17 @@ public class CatalinaContainer implement
             }
         }
 
-        return configureContext(engine, host, appInfo);
+        return new Callable<Context>() {
+            public Context call() throws ContainerException, LifecycleException {
+                StandardContext context = configureContext(engine, host, appInfo);
+                context.setParent(host);
+                context.start();
+                return context;
+            }
+        };
     }
 
-    private Context configureContext(Engine engine, Host host, ComponentConfig.WebappInfo appInfo) throws ContainerException {
+    private StandardContext configureContext(Engine engine, Host host, ComponentConfig.WebappInfo appInfo) throws ContainerException {
         // webapp settings
         Map<String, String> initParameters = appInfo.getInitParameters();
 
@@ -566,6 +582,9 @@ public class CatalinaContainer implement
 
         // create the web application context
         StandardContext context = (StandardContext) embedded.createContext(mount, location);
+        Debug.logInfo("host[" + host + "].addChild(" + context + ")", module);
+        //context.setDeployOnStartup(false);
+        //context.setBackgroundProcessorDelay(5);
         context.setJ2EEApplication(J2EE_APP);
         context.setJ2EEServer(J2EE_SERVER);
         context.setLoader(embedded.createLoader(ClassLoaderContainer.getClassLoader()));
@@ -631,7 +650,14 @@ public class CatalinaContainer implement
         // load the applications
         List<ComponentConfig.WebappInfo> webResourceInfos = ComponentConfig.getAllWebappResourceInfos();
         List<String> loadedMounts = FastList.newInstance();
-        if (webResourceInfos != null) {
+        if (webResourceInfos == null) {
+            return;
+        }
+
+        ScheduledExecutorService executor = ExecutionPool.getExecutor(CATALINA_THREAD_GROUP, "catalina-startup", -1, true);
+        try {
+            List<Future<Context>> futures = FastList.newInstance();
+
             for (int i = webResourceInfos.size(); i > 0; i--) {
                 ComponentConfig.WebappInfo appInfo = webResourceInfos.get(i - 1);
                 String engineName = appInfo.server;
@@ -650,7 +676,7 @@ public class CatalinaContainer implement
                     // means there are no existing loaded entries that overlap
                     // with the new set
                     if (appInfo.location != null) {
-                        createContext(appInfo);
+                        futures.add(executor.submit(createContext(appInfo)));
                     }
                     loadedMounts.addAll(keys);
                 } else {
@@ -658,6 +684,9 @@ public class CatalinaContainer implement
                     Debug.logInfo("Duplicate webapp mount; not loading : " + appInfo.getName() + " / " + appInfo.getLocation(), module);
                 }
             }
+            ExecutionPool.getAllFutures(futures);
+        } finally {
+            executor.shutdown();
         }
     }