Index: JettyConnector.java =================================================================== --- JettyConnector.java (revision 5734) +++ JettyConnector.java (working copy) @@ -11,28 +11,148 @@ package org.mule.providers.http.jetty; import org.mule.providers.http.HttpConnector; +import org.mule.umo.UMOException; +import org.mule.umo.endpoint.UMOEndpoint; +import org.mule.umo.endpoint.UMOEndpointURI; +import org.mule.umo.lifecycle.LifecycleException; +import org.mule.config.ThreadingProfile; +import org.mule.config.i18n.Message; +import org.mule.config.i18n.Messages; +import org.mule.util.StringUtils; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.servlet.ServletHandler; +import org.mortbay.http.SocketListener; +import org.mortbay.http.HttpContext; +import org.mortbay.util.InetAddrPort; +import java.util.Map; +import java.util.HashMap; +import java.util.Iterator; + + /** * ServletConnector is a channel adapter between Mule and a servlet * engine. - * + * * @author Ross Mason * @version $Revision$ */ -public class JettyConnector extends HttpConnector -{ - public JettyConnector() - { +public class JettyConnector extends HttpConnector { + private Map httpServers; + + public JettyConnector() { super(); + httpServers = new HashMap(); registerSupportedProtocol("http"); registerSupportedProtocol("https"); registerSupportedProtocol("rest"); } - public String getProtocol() - { + + public String getProtocol() { return "jetty"; } + + public HttpContext getContext(UMOEndpoint endpoint) { + Server server; + + synchronized (this) { + server = (Server) httpServers.get(getHostAndPort(endpoint.getEndpointURI())); + if (server == null) { + addServer(endpoint); + } + server = (Server) httpServers.get(getHostAndPort(endpoint.getEndpointURI())); + } + + // ToDo replace with correct internationalized log messge + if (server == null) { + throw new RuntimeException("Failed to retrieve HttpContext for: " + endpoint); + } + + return server.getContext("/"); + } + + + protected void doStart() throws UMOException { + } + + + protected void doStop() throws UMOException { + try { + synchronized (this) { + Iterator i = httpServers.values().iterator(); + while (i.hasNext()) { + Server httpServer = (Server) i.next(); + httpServer.stop(); + } + } + } + catch (InterruptedException e) { + throw new LifecycleException(new Message(Messages.FAILED_TO_STOP_X, "Jetty Http Receiver"), e, + this); + } + } + + protected void doDispose() { + try { + synchronized (this) { + Iterator i = httpServers.values().iterator(); + while (i.hasNext()) { + Server httpServer = (Server) i.next(); + httpServer.stop(); + } + } + } + catch (InterruptedException e) { + logger.error("Error disposing Jetty recevier on: "); //+ endpoint.getEndpointURI().toString(), e); + } + } + + /** + * Add a new Jetty server to the server map for the given endpoint + * @param endpoint the endpoint + */ + protected void addServer(UMOEndpoint endpoint) { + + SocketListener socketListener = new SocketListener(new InetAddrPort(endpoint.getEndpointURI().getPort())); + + // apply Threading settings + ThreadingProfile tp = getReceiverThreadingProfile(); + socketListener.setMaxIdleTimeMs((int) tp.getThreadTTL()); + int threadsActive = tp.getMaxThreadsActive(); + int threadsMin = socketListener.getMinThreads(); + if (threadsMin >= threadsActive) { + socketListener.setMinThreads(threadsActive - 1); + } + socketListener.setMaxThreads(threadsActive); + socketListener.setThreadsPriority(tp.getThreadPriority()); + + Server server = new Server(); + server.addListener(socketListener); + + ServletHandler handler = new ServletHandler(); + handler.addServlet("JettyReceiverServlet", "/", JettyReceiverServlet.class.getName()); + synchronized (this) { + httpServers.put(getHostAndPort(endpoint.getEndpointURI()), server); + } + } + + /** + * Return the host and port combination (ie, localhost:80) from the uri. + * + * @param uri the given URI + * @return the host and port combination + */ + private String getHostAndPort(UMOEndpointURI uri) { + String port = Integer.toString(uri.getPort()); + if (StringUtils.isEmpty(port)) { + port = "8080"; + } + return uri.getHost() + ":" + port; + + } + + }