WAR项目

时间:2015-05-06 10:08:50

标签: java multithreading rest servlets jersey

我已经创建了一个有效的RESTful jersey应用程序,构建为 JAR ,它有一个包含主类Converter的类的本地模块,其中包含{{1}等函数并且public static Pipe fromDNAtoRNA(String chr, int start, int end, Strand str)运行public static void main(String[] args),它使用远程存储库初始化本地对象,Converter.register()在端口8080上创建一个jetty服务器。

REST接口位于类Converter.runJettyServer()中,它只包含RestfulConverter的功能。这是一个样本:

Converter

现在我需要将应用程序作为 WAR 文件,根据我的经验,通常不会让程序员定义@GET @Path("/from/dna/chr/{chr-num}/strand/{str-type}/{start}..{end}/to/rna") @Produces("application/javascript") public String doDNA2RNA(@PathParam("chr-num") String chr, @PathParam("str-type") int str, @PathParam("start") int start, @PathParam("end") int end, @QueryParam("callback") String callback) { Pipe ans = null; try { switch (str) { case 1: ans = Converter .fromDNAtoRNA(chr, start, end, Converter.FORWARD); ... } 方法。

我使用main作为唯一的servlet。在任何人使用REST接口之前,我应该如何使用org.glassfish.jersey.servlet.ServletContainer初始化我的对象?

我尝试使用Converter.register()类扩展org.glassfish.jersey.servlet.ServletContainer,并覆盖此类RESTServlet方法( snippet-1 ):

init()

但这会引发public void init() throws ServletException { super.init(); try { Converter.main(null); } catch (DAOException e) { e.printStackTrace(); } }

我该如何处理?
如果我想在某个时间间隔更新我的对象(比如每4小时使用java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Handler而不中断REST接口cilents)会怎么样?
如何使用不同的线程将servlet / REST逻辑与应用程序逻辑的分区分开?
我应该定义一个新的类加载器吗?

我没有定义类加载器和多线程的经验,我已经尝试寻找教程,但没有找到任何可以帮助我的特定情况的东西。

编辑
这是关于 snippet-1 之后的完整错误日志:

Converter.register()

编辑2:
May 06, 2015 1:15:36 PM org.apache.catalina.core.ApplicationContext log SEVERE: StandardWrapper.Throwable java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Handler at il.ac.ariel.concord.service.RESTServlet.init(RESTServlet.java:16) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:817) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.server.Handler at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) ... 22 more May 06, 2015 1:15:36 PM org.apache.catalina.core.StandardWrapperValve invoke SEVERE: Allocate exception for servlet Extended Jersey java.lang.ClassNotFoundException: org.eclipse.jetty.server.Handler at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1157) at il.ac.ariel.concord.service.RESTServlet.init(RESTServlet.java:16) at javax.servlet.GenericServlet.init(GenericServlet.java:158) at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1231) at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1144) at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:817) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1517) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1474) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) 类中删除以前导入的jetty服务器后, snippet-1 工作正常。

1 个答案:

答案 0 :(得分:0)

查看http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html,特别是Startup Servlets上的位

  

@Startup Servlet

     

老式的方式。你可以做任何逻辑   在你的启动servlet中需要。这是一个简单的servlet   general在web.xml中获取>load-on-startup<参数或   @WebServlet(name="startup", loadOnStartup="2")注释。这个   servlet的启动时加载优先级为2,表示任何servlet都有   将在此之前加载低于2的加载优先级   大于2之后。如果你有一个被调用的init()方法   servlet容器向servlet指示servlet是什么   被置于服务中以及被调用的destroy()方法   servlet容器向servlet指示servlet是什么   被取消服务。

     

public class StartupServlet extends javax.servlet.http.HttpServlet {

     

public void init(ServletConfig config) throws ServletException { ....   }

     

public void destroy() { .... } }

如果你想在定时的基础上做事,你应该查看@Timeout注释http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html,尽管这只适用于像Wildfly这样的完整Java EE应用服务器