[undertow-dev] Embedding undertow into Red5
Mondain
mondain at gmail.com
Thu Feb 6 02:36:34 EST 2014
I'm a core dev on the Red5 project and I would like to offer undertow as an
alternative to our current embedded tomcat server. I have read through the
examples, unit tests, and documentation regarding undertow. I have coded
and run my "plugin" implementation, but all I am getting are "Not Found"
responses in the browser. My suspicion is that the web.xml is not being
read in and / or parsed, but I'm not sure since I'm new with this code
base. Below you will see how I'm setting up and starting things; let me
know what I'm doing incorrectly.
//get a reference to the current threads classloader
final ClassLoader originalClassLoader =
Thread.currentThread().getContextClassLoader();
// root location for servlet container
String serverRoot = System.getProperty("red5.root");
String confRoot = System.getProperty("red5.config_root");
System.setProperty("UNDERTOW_HOME", serverRoot);
if (webappFolder == null) {
// Use default webapps directory
webappFolder = FileUtil.formatPath(System.getProperty("red5.root"),
"/webapps");
}
System.setProperty("red5.webapp.root", webappFolder);
// scan the sub directories to determine our context paths
buildContextPathList(webappFolder);
try {
// create our servlet container
container = ServletContainer.Factory.newInstance();
// create a root path handler
final PathHandler rootHandler = new PathHandler();
// create one server and use it everywhere
Undertow.Builder builder = Undertow.builder();
// loop through connectors adding listeners to the builder
for (UndertowConnector undertowConnector : connectors) {
InetSocketAddress addr = undertowConnector.getSocketAddress();
builder.addListener(addr.getPort(), addr.getHostName(),
(undertowConnector.isSecure() ? ListenerType.HTTPS : ListenerType.HTTP));
}
// loop the other contexts
for (String contextPath : contextPaths) {
// create a class loader for the context
ClassLoader classLoader = buildWebClassLoader(originalClassLoader,
webappFolder, contextPath);
// create deployment info
DeploymentInfo info = deployment()
.setClassLoader(classLoader)
.setContextPath(contextPath.equalsIgnoreCase("/ROOT") ? "/"
: contextPath)
.setDefaultEncoding("UTF-8")
.setDeploymentName(contextPath.substring(1) + ".war")
.setUrlEncoding("UTF-8");
// add the new deployment to the servlet container
DeploymentManager manager = container.addDeployment(info);
// deploy
manager.deploy();
// add path
rootHandler.addPrefixPath(info.getContextPath(),
manager.start());
// get deployment
Deployment deployment = manager.getDeployment();
// get servlet context
final ServletContext servletContext = deployment.getServletContext();
log.debug("Context initialized: {}", servletContext.getContextPath());
try {
log.debug("Context: {}", servletContext);
final ClassLoader webClassLoader = info.getClassLoader();
log.debug("Webapp classloader: {}", webClassLoader);
// get the (spring) config file path
final String contextConfigLocation =
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.CONFIG_LOCATION_PARAM)
== null ? defaultSpringConfigLocation
:
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.CONFIG_LOCATION_PARAM);
log.debug("Spring context config location: {}", contextConfigLocation);
// get the (spring) parent context key
final String parentContextKey =
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.LOCATOR_FACTORY_KEY_PARAM)
== null ? defaultParentContextKey
:
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.LOCATOR_FACTORY_KEY_PARAM);
// set current threads classloader to the webapp classloader
Thread.currentThread().setContextClassLoader(webClassLoader);
// create a thread to speed-up application loading
Thread thread = new Thread("Launcher:" + servletContext.getContextPath()) {
public void run() {
//set thread context classloader to web classloader
Thread.currentThread().setContextClassLoader(webClassLoader);
//get the web app's parent context
ApplicationContext parentContext = null;
if (applicationContext.containsBean(parentContextKey)) {
parentContext = (ApplicationContext)
applicationContext.getBean(parentContextKey);
} else {
log.warn("Parent context was not found: {}", parentContextKey);
}
// create a spring web application context
final String contextClass =
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.CONTEXT_CLASS_PARAM)
== null ? XmlWebApplicationContext.class
.getName() :
servletContext.getInitParameter(org.springframework.web.context.ContextLoader.CONTEXT_CLASS_PARAM);
// web app context (spring)
ConfigurableWebApplicationContext appctx = null;
try {
Class<?> clazz = Class.forName(contextClass, true, webClassLoader);
appctx = (ConfigurableWebApplicationContext) clazz.newInstance();
// set the root webapp ctx attr on the each servlet context so spring can
find it later
servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
appctx);
appctx.setConfigLocations(new String[] { contextConfigLocation });
appctx.setServletContext(servletContext);
// set parent context or use current app context
if (parentContext != null) {
appctx.setParent(parentContext);
} else {
appctx.setParent(applicationContext);
}
// refresh the factory
appctx.refresh();
appctx.start();
} catch (Throwable e) {
throw new RuntimeException("Failed to load webapplication context class",
e);
}
}
};
thread.setDaemon(true);
thread.start();
} catch (Throwable t) {
t.printStackTrace();
} finally {
//reset the classloader
Thread.currentThread().setContextClassLoader(originalClassLoader);
}
}
// Dump deployments list
if (log.isDebugEnabled()) {
for (String deployment : container.listDeployments()) {
log.debug("Container deployment: {}", deployment);
}
}
// add a root handler
builder.setHandler(rootHandler);
// build the server instance
server = builder.build();
log.info("Starting Undertow");
server.start();
} catch (Exception e) {
if (e instanceof BindException || e.getMessage().indexOf("BindException")
!= -1) {
log.error("Error loading undertow, unable to bind connector. You may not
have permission to use the selected port", e);
} else {
log.error("Error loading undertow", e);
}
}
Regards,
Paul
--
http://gregoire.org/
http://code.google.com/p/red5/
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/undertow-dev/attachments/20140205/07ff415e/attachment.html
More information about the undertow-dev
mailing list