2015-05-06 3 views
0

Я создал рабочее приложение джерси RESTful, строить как JAR, который имеет локальный модуль классов с основным классом Converter, который содержит такие функции, как public static Pipe fromDNAtoRNA(String chr, int start, int end, Strand str), и имеет public static void main(String[] args), который работает Converter.register(), который инициализирует локальные объекты с использованием удаленных хранилищ, и Converter.runJettyServer(), что создает сервер Причала на порт 8080.Отдельные логические приложения потоки и потоки сервлетов в WAR проекта

интерфейс REST находится в классе RestfulConverter, который только что-то заворачивает функцию Converter. Вот пример:

@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); ... } 

Теперь мне нужно приложение, чтобы быть WAR файл, который в моем опыте обычно не позволить программисту определить метод main.

Я использую org.glassfish.jersey.servlet.ServletContainer как единственный сервлет. Как я должен использовать Converter.register() для инициализации моих объектов, прежде чем кто-либо сможет использовать интерфейс REST?

Я пытался продлить org.glassfish.jersey.servlet.ServletContainer с RESTServlet класса, и переопределить init() метод, как это (сниппет-1):

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

Но это бросает java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Handler

Как я должен подходить к этому?
Что делать, если я хочу обновить свои объекты на некоторый промежуток времени (например, используя Converter.register() каждые 4 часа без прерывания интерфейсов REST-интерфейса)?
Как отделить логику сервлета/REST от разделов моей прикладной логики с помощью разных потоков?
Должен ли я определить новый загрузчик классов?

У меня нет опыта в определении загрузчиков классов и нескольких потоков, и я попытался найти учебники, но не нашел ничего, что могло бы помочь в моей конкретной ситуации.

EDIT
Вот полный журнал ошибок после того, как в отношении сниппета-1:

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) 

EDIT 2:
После устранения предыдущих импорта молы сервера на Converter класса, сниппета -1 работал нормально.

+0

P ost журнал ошибок –

+0

@Deepika: какую информацию вы точно ищете в журнале ошибок? – BalusC

+0

@DeepikaRajani Я добавил журнал – fatsokol

ответ

0

Посмотрите http://blog.eisele.net/2010/12/seven-ways-to-get-things-started-java.html в частности битном на запуске сервлетов

@Startup Servlet

старинке. Вы можете выполнить любую логику, необходимую в вашем сервлете запуска. . Это простой сервлет в general, который получает параметр >load-on-startup< в вашем web.xml или аннотация @WebServlet(name="startup", loadOnStartup="2").Этот сервопривод имеет приоритет загрузки при запуске 2, то есть любой сервлет с до этого будет загружен приоритет нагрузки ниже 2, а те больше 2 после. Если у вас есть метод init(), который вызывается , контейнер сервлета указывает сервлету, что сервлет , помещенный в службу, и метод destroy(), который вызывается контейнером сервлетов, чтобы указать сервлет, который сервлет выведен из эксплуатации.

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 хотя это работает только на полной Java Сервер приложений EE, такой как Wildfly

Смежные вопросы