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/Bookmark

yorum yok. | 1.448 kez okundu |

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

RSS feed | Trackback URI

Yorumlar »

Henüz yorum yapılmamış.

İsim (gerekli)
E-posta (gerekli - kimseye gösterilmez)
Websayfanız
Yorumunuz (küçült | büyüt)
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> kullanabilirsiniz.

Trackback Listesi