Ü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