blob: 97ca381c8f2cf5890899ba7a5246988adcba5af0 [file] [log] [blame]
/*
* 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.
*/
package org.apache.openejb;
import org.apache.openejb.config.ServiceUtils;
import org.apache.openejb.util.Messages;
import java.util.concurrent.Semaphore;
/**
* @version $Rev$ $Date$
*/
public class Core {
static {
final String[] classes = {
"org.slf4j.LoggerFactory",
"org.slf4j.impl.StaticLoggerBinder",
"org.apache.openejb.config.sys.JaxbJavaee",
"org.apache.bval.jsr303.ApacheValidationProvider",
"org.apache.bval.jsr303.ApacheValidatorFactory",
"org.apache.bval.jsr303.ConstraintAnnotationAttributes",
"org.apache.bval.jsr303.ConstraintDefaults",
"org.apache.bval.jsr303.groups.GroupsComputer",
"org.apache.bval.jsr303.xml.ValidationMappingParser",
"org.apache.bval.util.PrivilegedActions",
"org.apache.geronimo.transaction.manager.TransactionManagerImpl",
"org.apache.openejb.InterfaceType",
"org.apache.openejb.assembler.classic.Assembler",
"org.apache.openejb.assembler.classic.AssemblerTool",
"org.apache.openejb.cdi.CdiBuilder",
"org.apache.openejb.cdi.ThreadSingletonServiceImpl",
"org.apache.openejb.config.AppValidator",
"org.apache.openejb.config.AnnotationDeployer",
"org.apache.openejb.config.AutoConfig",
"org.apache.openejb.config.ConfigurationFactory",
"org.apache.openejb.config.MBeanDeployer",
"org.apache.openejb.config.PersistenceContextAnnFactory",
"org.apache.openejb.core.ServerFederation",
"org.apache.openejb.core.ivm.EjbHomeProxyHandler$1",
"org.apache.openejb.core.ivm.EjbHomeProxyHandler$MethodType",
"org.apache.openejb.core.managed.ManagedContainer$MethodType",
"org.apache.openejb.loader.FileUtils",
"org.apache.openejb.loader.IO",
"org.apache.openejb.loader.SystemInstance",
"org.apache.openejb.monitoring.StatsInterceptor",
"org.apache.openejb.persistence.JtaEntityManagerRegistry",
"org.apache.openejb.util.Join",
"org.apache.openejb.util.JuliLogStreamFactory",
"org.apache.openejb.util.LogCategory",
"org.apache.openejb.util.Messages",
"org.apache.openejb.util.SafeToolkit",
"org.apache.openejb.util.StringTemplate",
"org.apache.openejb.util.proxy.ProxyManager",
"org.apache.openjpa.enhance.PCRegistry",
"org.apache.openjpa.lib.util.Localizer",
"org.apache.webbeans.logger.WebBeansLoggerFacade",
"org.apache.xbean.naming.reference.SimpleReference",
"org.apache.xbean.propertyeditor.PropertyEditors",
"org.apache.xbean.propertyeditor.ReferenceIdentityMap",
"org.apache.xbean.recipe.ReflectionUtil"
};
final Thread preloadMessages = new Thread() {
@Override
public void run() {
new Messages("org.apache.openejb.util.resources");
new Messages("org.apache.openejb.config");
new Messages("org.apache.openejb.config.resources");
}
};
preloadMessages.start();
final Thread preloadServiceProviders = new Thread() {
@Override
public void run() {
try {
ServiceUtils.getServiceProviders();
} catch (OpenEJBException e) {
// no-op
}
}
};
preloadServiceProviders.start();
final int permits = 2 * Runtime.getRuntime().availableProcessors() + 1;
final Semaphore semaphore = new Semaphore(0);
final ClassLoader loader = OpenEjbContainer.class.getClassLoader();
try { // logging classes should be loaded before any other classes so do it here synchronously
Class.forName("org.apache.openejb.util.Logger", true, loader);
Class.forName("org.apache.openejb.util.JuliLogStreamFactory", true, loader);
} catch (Throwable e) {
// no-op
}
final int part = (int) Math.round(classes.length * 1. / permits);
for (int i = 0; i < permits; i++) {
final int current = i;
final int offset = i * part;
final Thread thread = new Thread() {
@Override
public void run() {
int max = offset + part;
if (current == permits - 1) { // last one
max = classes.length;
}
for (int c = offset; c < max; c++) {
try {
Class.forName(classes[c], true, loader);
} catch (Throwable e) {
// no-op
}
}
semaphore.release();
}
};
thread.setDaemon(true);
thread.start();
}
try {
preloadServiceProviders.join();
preloadMessages.join();
semaphore.acquire(permits);
} catch (InterruptedException e) {
Thread.interrupted();
}
}
public static void warmup() {}
}