Embedded Jetty

Eki 6th, 2009 | Yazar: Özcan Acar | Kategori: Püf Noktası

Ü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



Püf Noktası kategorisinden son yazılar

Share Button

Özcan Acar

Bilgisayar mühendisi olan Özcan Acar 1997 yılından beri programcı olarak çalışıyor.

KurumsalJava.com, SmartHomeProgrammer.com ve Mikrodevre.com adresleri altında blog yazıyor. Kurduğu BTSoru.com'da ona yazılımla ile ilgili sorularınızı yöneltebilirsiniz. Pratik Programcı Yayınları bünyesinde Pratik Spring, Pratik Agile, Pratik Git ve Design Patterns ismini taşıyan kitapları bulunmaktadır. 21.12.2009 tarihinde Java Champion olarak seçildi.
  • Share/Bookmark
yorum yok. | 3.044 kez okundu |

1 Yıldız2 Yıldız3 Yıldız4 Yıldız5 Yıldız (Değerlendirme bulunmuyor)
Loading ... Loading ...
Tags:

BU YAZI İÇİN BİR YORUM YAPABİLİRSİNİZ.