Запустить Hessian сервлет в Jetty контэйнере
Изначально задача стояла следующая:
есть два хоста и они должны с легкостью обмениваться между собой данными в обоих направлениях, причем реализация должна быть наиболее простой с точки зрения архитектуры. Я выбрал Hessian протокол
[url]http://www.caucho.com/hessian/.[/url] Это простой в установке и настройке сервис.
Клиент может быть stand alone, а сервер в виде сервлета - ставиться в сервлет контейнер. Но связь нужна такая чтобы по сети работали два автономных приложения через сеть - если же поставить на одну сторону Hessian Server например в Tomcat то он окажеться изолированным от stand-alone приложения с которым нужно связываться, т.е. нужно бы вызывать удаленно методы классов этого приложения, но такого не получиться, т.к. HessianServer стоит отдельно. Тогда возникает следующая мысль - если в само приложение встроить контейнер, в него установить Hessian Server, тем самым обеспечив однородную среду классов и методов. Такое решение есть - Jetty.
[url]http://jetty.mortbay.org/index.html[/url]
Я изучил документацию и написал следующий код:
[CODE]import org.mortbay.jetty.Server;
import org.mortbay.jetty.Connector;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.servlet.ServletHandler;
import org.mortbay.jetty.servlet.ServletHolder;
public class MinimalServlet {
public static void main(String[] args) throws Exception {
Server server = new Server();
Connector connector=new SocketConnector();
connector.setPort(8888);
server.setConnectors(new Connector[]{connector});
ServletHandler handler=new ServletHandler();
handler.addServletWithMapping("com.caucho.hessian.server.HessianServlet", "/hello");
ServletHolder holder = handler.getServlet("com.caucho.hessian.server.HessianServlet");
holder.setInitParameter("home-class", "service.BasicService");
holder.setInitParameter("home-api", "service.Basic");
server.setHandler(handler);
server.start();
server.join();
}
}[/CODE]
При запуске вроде бы все происходит нормально - в консоль пишет:
[CODE]2007-08-06 18:58:53.920::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2007-08-06 18:58:53.998::INFO: jetty-6.1.5
2007-08-06 18:58:53.186::INFO: Started SocketConnector@0.0.0.0:8888[/CODE]
Но при запросе в браузере выдает следующее
[CODE]
HTTP ERROR: 500
INTERNAL_SERVER_ERROR
RequestURI=/hello
Powered by jetty://
[/CODE]
И пишет в консоль:
[CODE]2007-08-06 18:58:53.920::INFO: Logging to STDERR via org.mortbay.log.StdErrLog
2007-08-06 18:58:53.998::INFO: jetty-6.1.5
2007-08-06 18:58:53.186::INFO: Started SocketConnector@0.0.0.0:8888
2007-08-06 18:59:02.181::WARN: Nested in javax.servlet.ServletException: init:
java.lang.StackOverflowError
at java.util.HashMap.get(HashMap.java:343)
at org.mortbay.jetty.servlet.Holder.getInitParameter(Holder.java:114)
at org.mortbay.jetty.servlet.ServletHolder$Config.getInitParameter(ServletHolder.j ava:530)
at javax.servlet.GenericServlet.getInitParameter(GenericServlet.java:117)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:187)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:300)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:194)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:300)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:194)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:300)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:194)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:300)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:194)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:300)
at com.caucho.hessian.server.HessianServlet.init(HessianServlet.java:194)[/CODE]
Т.е. на [url]http://localhost:8888/hello[/url] по идее должен работать Hessian Server.
Хотя тот же самый сервлет, установленный на моей машине на Tomcat выдает:
[CODE]Hessian Requires POST[/CODE]
И соответственно работает клиент.
Помогите разобраться в этой проблеме?