You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by db...@apache.org on 2011/10/02 14:59:01 UTC

svn commit: r1178185 - in /openejb/trunk/openejb: assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/ assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/ assembly/o...

Author: dblevins
Date: Sun Oct  2 12:59:00 2011
New Revision: 1178185

URL: http://svn.apache.org/viewvc?rev=1178185&view=rev
Log:
OPENEJB-1693: Embedded TomEE speed improvements
Reworked the embedded container support so that it uses the Tomcat embedded code.. and wow!  Excellent results when combined with our already light code.

Modified:
    openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java
    openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
    openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/EmbeddedJarScanner.java
    openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/TomcatHelper.java
    openejb/trunk/openejb/assembly/openejb-tomcat/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java

Modified: openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java (original)
+++ openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatLoader.java Sun Oct  2 12:59:00 2011
@@ -114,16 +114,23 @@ public class TomcatLoader implements Loa
     public void init(Properties properties) throws Exception {
 
         // Enable System EJBs like the MEJB and DeployerEJB
+        initDefaults(properties);
+
+        // Loader maybe the first thing executed in a new classloader
+        // so we must attempt to initialize the system instance.
+        SystemInstance.init(properties);
+        initialize(properties);
+    }
+
+    public void initDefaults(Properties properties) {
         setIfNull(properties, "openejb.deployments.classpath", "true");
         setIfNull(properties, "openejb.deployments.classpath.filter.systemapps", "false");
 
         //Sets default service provider
         setIfNull(properties, "openejb.provider.default", "org.apache.openejb." + platform);
+    }
 
-        // Loader maybe the first thing executed in a new classloader
-        // so we must attempt to initialize the system instance.
-        SystemInstance.init(properties);
-
+    public void initialize(Properties properties) throws Exception {
         //Install Log
         OptionsLog.install();
 

Modified: openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java (original)
+++ openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-catalina/src/main/java/org/apache/openejb/tomcat/catalina/TomcatWebAppBuilder.java Sun Oct  2 12:59:00 2011
@@ -18,6 +18,7 @@ package org.apache.openejb.tomcat.catali
 
 import org.apache.catalina.Container;
 import org.apache.catalina.Engine;
+import org.apache.catalina.Host;
 import org.apache.catalina.LifecycleListener;
 import org.apache.catalina.Pipeline;
 import org.apache.catalina.Service;
@@ -128,6 +129,7 @@ public class TomcatWebAppBuilder impleme
      */
     //Key is the host name
     private final Map<String, HostConfig> deployers = new TreeMap<String, HostConfig>();
+    private final Map<String, Host> hosts = new TreeMap<String, Host>();
     /**
      * Deployed web applications
      */
@@ -168,6 +170,7 @@ public class TomcatWebAppBuilder impleme
                 for (Container engineChild : engine.findChildren()) {
                     if (engineChild instanceof StandardHost) {
                         StandardHost host = (StandardHost) engineChild;
+                        hosts.put(host.getName(), host);
                         for (LifecycleListener listener : host.findLifecycleListeners()) {
                             if (listener instanceof HostConfig) {
                                 HostConfig hostConfig = (HostConfig) listener;
@@ -226,13 +229,21 @@ public class TomcatWebAppBuilder impleme
                 }
                 
                 // TODO: instead of storing deployers, we could just lookup the right hostconfig for the server.
-                HostConfig deployer = deployers.get(host);
+                final HostConfig deployer = deployers.get(host);
                 if (deployer != null) {
                     // host isn't set until we call deployer.manageApp, so pass it
                     ContextInfo contextInfo = addContextInfo(host, standardContext);
                     contextInfo.appInfo = appInfo;
                     contextInfo.deployer = deployer;
                     deployer.manageApp(standardContext);
+                } else if (hosts.containsKey(host)){
+                    Host theHost = hosts.get(host);
+
+                    ContextInfo contextInfo = addContextInfo(host, standardContext);
+                    contextInfo.appInfo = appInfo;
+                    contextInfo.host = theHost;
+
+                    theHost.addChild(standardContext);
                 }
             }
         }
@@ -285,10 +296,16 @@ public class TomcatWebAppBuilder impleme
     public void undeployWebApps(AppInfo appInfo) throws Exception {
         for (WebAppInfo webApp : appInfo.webApps) {
             ContextInfo contextInfo = getContextInfo(webApp);
+
             if (contextInfo != null && contextInfo.deployer != null) {
                 StandardContext standardContext = contextInfo.standardContext;
                 HostConfig deployer = contextInfo.deployer;
-                deployer.unmanageApp(standardContext.getPath());
+
+                if (deployer != null) {
+                    deployer.unmanageApp(standardContext.getPath());
+                } else if (contextInfo.host != null) {
+                    contextInfo.host.removeChild(standardContext);
+                }
                 deleteDir(new File(standardContext.getServletContext().getRealPath("")));
                 removeContextInfo(standardContext);
             }
@@ -1073,6 +1090,7 @@ public class TomcatWebAppBuilder impleme
         public AppInfo appInfo;
         public StandardContext standardContext;
         public HostConfig deployer;
+        public Host host;
         public LinkResolver<EntityManagerFactory> emfLinkResolver;
     }
 

Modified: openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/EmbeddedJarScanner.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/EmbeddedJarScanner.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/EmbeddedJarScanner.java (original)
+++ openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/EmbeddedJarScanner.java Sun Oct  2 12:59:00 2011
@@ -69,8 +69,15 @@ public class EmbeddedJarScanner implemen
             final UrlSet classpath = new UrlSet(classloader);
 
             UrlSet excluded = classpath.exclude(".*/WEB-INF/lib/.*");
-            excluded = excluded.exclude(".*myfaces-impl-.*");
-            excluded = excluded.exclude(".*openejb-jsf-.*");
+
+            // TODO Commenting out these two lines can have an impact on JSF
+            // There's something that gets pulled from the classpath here
+            // lets figure out what it is so we can optimize it as the effect
+            // of adding myfaces here is that the entire jar is scanned, which
+            // is really slow.
+
+//            excluded = excluded.exclude(".*myfaces-impl-.*");
+//            excluded = excluded.exclude(".*openejb-jsf-.*");
 
             final UrlSet scan = classpath.exclude(excluded);
 

Modified: openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/TomcatHelper.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/TomcatHelper.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/TomcatHelper.java (original)
+++ openejb/trunk/openejb/assembly/openejb-tomcat/openejb-tomcat-loader/src/main/java/org/apache/openejb/tomcat/loader/TomcatHelper.java Sun Oct  2 12:59:00 2011
@@ -29,6 +29,7 @@ import org.apache.catalina.Realm;
 import org.apache.catalina.Wrapper;
 import org.apache.catalina.core.StandardContext;
 import org.apache.catalina.core.StandardServer;
+import org.apache.openejb.loader.SystemInstance;
 
 public class TomcatHelper {
 
@@ -44,8 +45,11 @@ public class TomcatHelper {
 
 	public static StandardServer getServer() {
 		StandardServer server = null;
-		
-		// first try to use Tomcat's ServerFactory class to give us a reference to the server
+
+        server = SystemInstance.get().getComponent(StandardServer.class);
+        if (server != null) return server;
+
+        // first try to use Tomcat's ServerFactory class to give us a reference to the server
 		
 		try {
 			Class<?> tomcatServerFactory = Class.forName("org.apache.catalina.ServerFactory");

Modified: openejb/trunk/openejb/assembly/openejb-tomcat/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/assembly/openejb-tomcat/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/assembly/openejb-tomcat/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java (original)
+++ openejb/trunk/openejb/assembly/openejb-tomcat/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java Sun Oct  2 12:59:00 2011
@@ -16,7 +16,16 @@
  */
 package org.apache.tomee.embedded;
 
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.Server;
+import org.apache.catalina.Service;
+import org.apache.catalina.connector.Connector;
+import org.apache.catalina.core.StandardServer;
+import org.apache.catalina.session.StandardManager;
 import org.apache.catalina.startup.Bootstrap;
+import org.apache.catalina.startup.CatalinaProperties;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.coyote.http11.Http11Protocol;
 import org.apache.openejb.NoSuchApplicationException;
 import org.apache.openejb.OpenEJBException;
 import org.apache.openejb.UndeployException;
@@ -47,12 +56,17 @@ import java.util.Properties;
  */
 public class Container {
 
+    static {
+        // org.apache.naming
+        Assembler.installNaming("org.apache.naming");
+    }
     private Bootstrap bootstrap;
     protected Configuration configuration;
-    private File catalinaDirectory;
+    private File base;
     private Map<String, String> moduleIds = new HashMap<String, String>();
     private ConfigurationFactory configurationFactory;
     private Assembler assembler;
+    private final Tomcat tomcat;
 
     public Container() {
         final Configuration configuration = new Configuration();
@@ -60,6 +74,7 @@ public class Container {
         configuration.setStopPort(23881);
         setup(configuration);
         final Class<Bootstrap> bootstrapClass = Bootstrap.class;
+        tomcat = new TomcatWithFastSessionIDs();
     }
 
     public void setup(Configuration configuration) {
@@ -69,21 +84,51 @@ public class Container {
     public void start() throws Exception {
         final String dir = getBaseDir();
 
-        catalinaDirectory = new File(dir);
-        if (catalinaDirectory.exists()) {
-            catalinaDirectory.delete();
+        base = new File(dir);
+        if (base.exists()) {
+            base.delete();
         }
 
-        catalinaDirectory.mkdirs();
-        catalinaDirectory.deleteOnExit();
-
-        createTomcatDirectories(catalinaDirectory);
-        copyConfigs(catalinaDirectory);
+        base.mkdirs();
+        // TODO: this delete on exit won't actually work
+        base.deleteOnExit();
+
+        final File conf = createDirectory(base, "conf");
+        final File lib = createDirectory(base, "lib");
+        final File logs = createDirectory(base, "logs");
+        final File webapps = createDirectory(base, "webapps");
+        final File temp = createDirectory(base, "temp");
+        final File work = createDirectory(base, "work");
+
+        copyFileTo(conf, "catalina.policy");
+        copyTemplateTo(conf, "catalina.properties");
+        copyFileTo(conf, "context.xml");
+        copyFileTo(conf, "logging.properties");
+        copyFileTo(conf, "openejb.xml");
+        copyFileTo(conf, "server.xml");
+        copyFileTo(conf, "tomcat-users.xml");
+        copyFileTo(conf, "web.xml");
+
+        // Need to use JULI so log messages from the tests are visible
+        System.setProperty("java.util.logging.manager", "org.apache.juli.ClassLoaderLogManager");
+        System.setProperty("java.util.logging.config.file", new File(conf, "logging.properties").toString());
+        System.setProperty("catalina.base", base.getAbsolutePath());
+
+        // Trigger loading of catalina.properties
+        CatalinaProperties.getProperty("foo");
+
+        Connector connector = new Connector(Http11Protocol.class.getName());
+        connector.setPort(configuration.getHttpPort());
+        connector.setAttribute("connectionTimeout", "3000");
+        tomcat.getService().addConnector(connector);
+        tomcat.setConnector(connector);
+        tomcat.setBaseDir(base.getAbsolutePath());
+        tomcat.getHost().setAppBase(webapps.getAbsolutePath());
 
         // Bootstrap Tomcat
-        System.out.println("Starting TomEE from: " + catalinaDirectory.getAbsolutePath());
+        System.out.println("Starting TomEE from: " + base.getAbsolutePath());
 
-        String catalinaBase = catalinaDirectory.getAbsolutePath();
+        String catalinaBase = base.getAbsolutePath();
         System.setProperty("openejb.logging.embedded", "true");
         System.setProperty("openejb.deployments.classpath", "false");
         System.setProperty("catalina.home", catalinaBase);
@@ -92,8 +137,11 @@ public class Container {
         System.setProperty("openejb.base", catalinaBase);
         System.setProperty("openejb.servicemanager.enabled", "false");
 
-        bootstrap = new Bootstrap();
-        bootstrap.start();
+        tomcat.start();
+
+
+//        bootstrap = new Bootstrap();
+//        bootstrap.start();
 
         // Bootstrap OpenEJB
         Properties properties = new Properties();
@@ -128,7 +176,13 @@ public class Container {
         } catch (Throwable e) {
         }
 
-        new TomcatLoader().init(properties);
+        SystemInstance.init(System.getProperties());
+        SystemInstance.get().setComponent(StandardServer.class, (StandardServer) tomcat.getServer());
+
+        TomcatLoader loader = new TomcatLoader();
+        loader.initDefaults(properties);
+        loader.initialize(properties);
+
 
         assembler = SystemInstance.get().getComponent(Assembler.class);
         configurationFactory = new ConfigurationFactory();
@@ -146,8 +200,8 @@ public class Container {
     }
 
     public void stop() throws Exception {
-        bootstrap.stopServer();
-        deleteTree(catalinaDirectory);
+        tomcat.stop();
+        deleteTree(base);
     }
 
     public void deploy(String name, File file) throws OpenEJBException, IOException, NamingException {
@@ -188,18 +242,6 @@ public class Container {
         }
     }
 
-    private void copyConfigs(File directory) throws Exception {
-        File confDir = new File(directory, "conf");
-        copyFileTo(confDir, "catalina.policy");
-        copyTemplateTo(confDir, "catalina.properties");
-        copyFileTo(confDir, "context.xml");
-        copyFileTo(confDir, "logging.properties");
-        copyFileTo(confDir, "openejb.xml");
-        copyFileTo(confDir, "server.xml");
-        copyFileTo(confDir, "tomcat-users.xml");
-        copyFileTo(confDir, "web.xml");
-    }
-
     private void copyTemplateTo(File targetDir, String filename) throws Exception {
         Velocity.setProperty(Velocity.RUNTIME_LOG_LOGSYSTEM, new Log4JLogChute());
         Velocity.setProperty(Velocity.RESOURCE_LOADER, "class");
@@ -245,7 +287,37 @@ public class Container {
         createDirectory(directory, "work");
     }
 
-    private void createDirectory(File parent, String directory) {
-        new File(parent, directory).mkdirs();
+    private File createDirectory(File parent, String directory) {
+        File dir = new File(parent, directory);
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new IllegalStateException("Unable to make dir " + dir.getAbsolutePath());
+        }
+
+        return dir;
+    }
+
+    private static class TomcatWithFastSessionIDs extends Tomcat {
+
+        @Override
+        public void start() throws LifecycleException {
+            // Use fast, insecure session ID generation for all tests
+            Server server = getServer();
+            for (Service service : server.findServices()) {
+                org.apache.catalina.Container e = service.getContainer();
+                for (org.apache.catalina.Container h : e.findChildren()) {
+                    for (org.apache.catalina.Container c : h.findChildren()) {
+                        StandardManager m = (StandardManager) c.getManager();
+                        if (m == null) {
+                            m = new StandardManager();
+                            m.setSecureRandomClass(
+                                    "org.apache.catalina.startup.FastNonSecureRandom");
+                            c.setManager(m);
+                        }
+                    }
+                }
+            }
+            super.start();
+        }
     }
+
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1178185&r1=1178184&r2=1178185&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java Sun Oct  2 12:59:00 2011
@@ -273,10 +273,15 @@ public class Assembler extends Assembler
         if (SystemInstance.get().hasProperty("openejb.geronimo")) return;
 
         /* Add IntraVM JNDI service /////////////////////*/
+        installNaming(OPENEJB_URL_PKG_PREFIX);
+        /*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
+    }
+
+    public static void installNaming(String prefix) {
         Properties systemProperties = System.getProperties();
         synchronized (systemProperties) {
             String str = systemProperties.getProperty(Context.URL_PKG_PREFIXES);
-            String naming = OPENEJB_URL_PKG_PREFIX;
+            String naming = prefix;
             if (str == null) {
                 str = naming;
             } else if (str.indexOf(naming) == -1) {
@@ -284,7 +289,6 @@ public class Assembler extends Assembler
             }
             systemProperties.setProperty(Context.URL_PKG_PREFIXES, str);
         }
-        /*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*/
     }
 
     private static ThreadLocal<Map<String, Object>> context = new ThreadLocal<Map<String, Object>>();