Skip to main content

Notice: this Wiki will be going read only early in 2024 and edits will no longer be possible. Please see: https://gitlab.eclipse.org/eclipsefdn/helpdesk/-/wikis/Wiki-shutdown-plan for the plan.

Jump to: navigation, search

SMILA/Documentation/JettyHttpServer

< SMILA‎ | Documentation
Revision as of 10:26, 1 March 2011 by Juergen.schumacher.attensity.com (Talk | contribs) (Configuration)

Configuration and Usage of the Jetty HTTP server embedded in SMILA

Overview

The embedding of the Jetty server is implemented in bundle org.eclipse.smila.http.server. When the bundle is activated it starts an OSGi service org.eclipse.smila.http.server.HttpService that creates a Jetty server from a configuration files, adds request handlers provided by other OSGi services and starts the server.

Configuration

To configure the embedded Jetty server, place a file named jetty.xml in the configuration directory org.eclipse.smila.http.server. If the configuration area does not contain such a file, a default file provided by the HTTP server bundle itself is used. It's probably the most simple file possible:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
 
    <!-- =========================================================== -->
    <!-- Server Thread Pool                                          -->
    <!-- =========================================================== -->
    <Set name="ThreadPool">
      <!-- Default queued blocking threadpool -->
      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
        <Set name="minThreads">10</Set>
        <Set name="maxThreads">200</Set>
        <Set name="detailedDump">false</Set>
      </New>
    </Set>
 
    <!-- =========================================================== -->
    <!-- Set connectors                                              -->
    <!-- =========================================================== -->
 
    <Call name="addConnector">
      <Arg>
          <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
            <Set name="host"><Property name="jetty.host" /></Set>
            <Set name="port"><Property name="jetty.port" default="8080"/></Set>
            <Set name="maxIdleTime">300000</Set>
            <Set name="Acceptors">2</Set>
            <Set name="statsOn">false</Set>
            <Set name="confidentialPort">8443</Set>
	    <Set name="lowResourcesConnections">20000</Set>
	    <Set name="lowResourcesMaxIdleTime">5000</Set>
          </New>
      </Arg>
    </Call>
 
    <!-- =========================================================== -->
    <!-- Set handler Collection Structure                            --> 
    <!-- =========================================================== -->
    <Set name="handler">
      <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
    </Set>
 
    <!-- =========================================================== -->
    <!-- extra options                                               -->
    <!-- =========================================================== -->
    <Set name="stopAtShutdown">true</Set>
    <Set name="sendServerVersion">true</Set>
    <Set name="sendDateHeader">true</Set>
    <Set name="gracefulShutdown">1000</Set>
    <Set name="dumpAfterStart">false</Set>
    <Set name="dumpBeforeStop">false</Set>
</Configure>

For more details on all the configuration properties used here refer to the Jetty documentation next door.

It basically configures the server to listen at port 8080 and adds a default handler that responses with HTTP status 404 (NOT FOUND) if no other handler was found to handle the request, and it lists the available handlers, so it's not especially useful by itself.

Usage

Handlers can be added by two different approaches: Either by extending the jetty.xml file, or by registering different kinds of OSGi services that are references by the HTTP server service and registered at startup.

Before we dive into the details, here are some important advices:

  • To implement functionality you will probably write classes in an own bundle. If the HTTP server needs to instantiate these classes (e.g. servlets used by a web application) you must register your bundle as a "buddy" to the server bundle. So if you have problems deploying your own code and get class loading related errors, first check if your MANIFEST.MF contains this line:
Eclipse-RegisterBuddy: org.eclipse.smila.http.server
  • The Jetty server must be stopped and restarted to register additional handlers. Therefore if you use OSGi services to register functionality in the server, you should take care that the HTTP server bundle is started in a higher run level than all bundles providing handler services. This is the reason that in the SMILA application the HTTP server is started on the highest run level of all bundles. A nice side effect of this is that you can check from outside if the startup if SMILA has finished: If you can connect to the HTTP server, SMILA is up and running:
..., \
org.eclipse.smila.http.server@5:start
  • You should also not add handler services to the HTTP server bundle itself using Declarative Services, because the start order of DS services in a single bundle is not deterministic.

Deployment via jetty.xml

The straight forward way is to use the jetty.xml configuration file itself to add handlers for different URL contexts. In theory it should be possible to do everything you can normally do in this configuration file, see the Jetty documentation for details. However, there may be some classloading fun ahead.

The default configuration file used in the SMILA application replaces the "handler" section of the default configuration to deploy a simple Web application for search at http://localhost:8080/SMILA/search:

<!-- =========================================================== -->
<!-- Set handler Collection Structure                            --> 
<!-- =========================================================== -->
<Set name="handler">
  <New class="org.eclipse.jetty.server.handler.HandlerList">
    <Set name="handlers">
      <Array type="org.eclipse.jetty.server.Handler">
        <Item>
          <New class="org.eclipse.jetty.webapp.WebAppContext">
            <Set name="contextPath">/SMILA</Set>
            <Set name="resourceBase">configuration/org.eclipse.smila.search.servlet/webapp</Set>
            <Set name="descriptor">configuration/org.eclipse.smila.search.servlet/webapp/WEB-INF/web.xml</Set>
            <Set name="defaultsDescriptor">configuration/org.eclipse.smila.http.server/webdefault.xml</Set>
            <Set name="parentLoaderPriority">true</Set>
          </New>
        </Item>
        <Item>
          <New class="org.eclipse.jetty.server.handler.DefaultHandler"/>
        </Item>
      </Array>
    </Set>
  </New>
</Set>

It registeres a standard web application located at configuration/org.eclipse.smila.search.servlet/webapp. Note that you must also specify the "defaultsDescriptor" property because the embedded Jetty cannot find one at the default location.

HttpHandler services

RequestDispatcher and RequestHandler services

JettyHandler services

ResourceHandlerService
ServletContextService
WebappContextService

Back to the top