我已经创建了一个有效的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 工作正常。
答案 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应用服务器