Embedded Jetty

Üzerinde çalıştığım açık kaynaklı JStorage projesinde Tomcat yerine, bir Java sınıfından koşturulabilecek Jetty containeri kullandım. Jetty, Tomcat gibi bir JSP/Servlet containeri. Aşağıdaki örnekte yer aldığı gibi Jetty bir Java (main()) program tarafından çalıştırilabilir.

package org.jstorage.tracker.impl.restfull; 
  
 import org.apache.commons.logging.Log; 
 import org.apache.commons.logging.LogFactory; 
 import org.jstorage.tracker.TrackerException; 
 import org.jstorage.tracker.impl.AbstractTracker; 
 import org.mortbay.jetty.Connector; 
 import org.mortbay.jetty.Server; 
 import org.mortbay.jetty.bio.SocketConnector; 
 import org.mortbay.jetty.servlet.Context; 
 import org.mortbay.jetty.servlet.ServletHandler; 
 import org.mortbay.jetty.servlet.ServletHolder; 
 import org.springframework.context.ApplicationContext; 
 import org.springframework.context.annotation.Scope; 
 import org.springframework.context.support.ClassPathXmlApplicationContext; 
 import org.springframework.stereotype.Component; 
 import org.springframework.web.context.ContextLoaderListener; 
 import org.springframework.web.servlet.DispatcherServlet; 
  
  
  
 @Component("RestfullTracker") 
 @Scope("singleton") 
 public class RestfulTrackerImpl extends AbstractTracker 
 { 
          
         private final Log logger = LogFactory.getLog(RestfulTrackerImpl.class); 
          
          
         private Server server; 
         ApplicationContext applicationContext; 
         private int port; 
         private String ip; 
          
  
         public RestfulTrackerImpl() 
         { 
                  
         } 
          
          
         protected void finalize() throws Throwable  
         { 
                 super.finalize(); // not necessary if extending Object. 
                 logger.info("Stopping storage node with jetty"); 
                 server.stop(); 
         } 
  
  
  
         @Override 
         public void runInProductionMode() 
         { 
                 try  
                 { 
                         logger.info("Starting storage node with jetty in PRODUCTION MODE"); 
                         server = new Server(); 
                         Connector connector = new SocketConnector(); 
                         connector.setPort(getPort()); 
                         server.setConnectors(new Connector[] { connector }); 
  
                         ServletHandler handler = new ServletHandler(); 
                         server.setHandler(handler); 
  
                         handler.addServletWithMapping("org.jstorage.tracker.impl.http.TrackerServlet","/"); 
  
                         server.start(); 
  
                         server.join(); 
                 } 
                 catch (Exception e)  
                 { 
                         throw new TrackerException(e); 
                 } 
         } 
  
  
  
         @Override 
         public void runInTestMode() 
         { 
                 try  
                 { 
                         Server server = new Server(); 
                         Connector connector = new SocketConnector(); 
                         connector.setPort(getPort()); 
                         server.setConnectors(new Connector[] { connector }); 
  
                          
                         Context context = new Context(server, "/", Context.SESSIONS); 
  
                         ServletHolder servletHolder = new ServletHolder(new DispatcherServlet()); 
                         servletHolder.setInitParameter("contextConfigLocation","classpath:spring-restfulltracker.xml"); 
                         servletHolder.setInitOrder(1); 
                         context.addServlet(servletHolder, "/*"); 
  
                          
                         // Add the Spring context listener 
                         context.getInitParams().put("contextConfigLocation","classpath:spring-restfulltracker.xml"); 
                         ContextLoaderListener listener = new ContextLoaderListener(); 
                         context.addEventListener(listener); 
  
                         server.start(); 
                         context.getServletHandler().initialize(); 
                                                  
                 } 
                 catch (Exception e)  
                 { 
                         throw new TrackerException(e); 
                 } 
         } 
          
          
         public ApplicationContext getApplicationContext() 
         { 
                 if(applicationContext == null) 
                 { 
                         applicationContext = new ClassPathXmlApplicationContext("spring-restfulltracker.xml");  
                 } 
                 return this.applicationContext; 
         } 
  
  
         public int getPort()  
         { 
                 int p = this.port; 
                  
                 try  
                 { 
                         p = Integer.parseInt(System.getProperty("port")); 
                 }  
                 catch (Exception e)  
                 { 
                         //ignore 
                 } 
                  
                 return p; 
         } 
  
  
         public void setPort(int port) { 
                 this.port = port; 
         } 
  
  
         public String getIp()  
         { 
                 String ip = "127.0.0.1"; 
                  
                 try  
                 { 
                         ip = (String)System.getProperty("ip"); 
                 }  
                 catch (Exception e)  
                 { 
                         //ignore 
                 } 
                 return ip; 
         } 
  
          
  
         public void setIp(String ip)  
         { 
                 this.ip = ip; 
         } 
 } 
 

59. satırda org.jstorage.tracker.impl.http.TrackerServlet isimli Servlet sınıfını http://127.0.0.1/ adresinde erişilecek şekilde sisteme ekliyorum. Bu mapping işlemini genelde web aplikasyonlarında web.xml bünyesinde aşağıdaki şekilde gerçekleştiririz.

<servlet>
		<servlet-name>ForwardedServlet</servlet-name>
		<servlet-class>tests.Filter.ForwardedServlet</servlet-class>
</servlet>
<servlet-mapping>
		<servlet-name>ForwardedServlet</servlet-name>
		<url-pattern>/ForwardedServlet</url-pattern>
</servlet-mapping>

Yukarda yer alan programı çalıştırdıktan sonra Web tarayıcısı üzerinden http://127.0.0.1/ adresine bağlandığımız taktirde TrackerServlet.doGet() metodu işlem görecektir. -Dport=8080 şeklinde bir sistem değişkeni kullanarak (118. satır), Jetty’nin çalıştırılacağı portu değiştirebiliriz.


EOF (End of Fun)
Özcan Acar