Ü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