2015-08-05 3 views
1

У меня есть сервлет, который аннотированный так:RequestDispatcher инициализирует сервлет, который уже инстанцированный через нагрузку на старте

@WebServlet(value="/MyServiceServlet", loadOnStartup=1) 

Это приводит к Servlet быть инстанцированный при запуске приложения и его init() метод который вызывается , Отлично! (В методе init(), Нить начала выполнять некоторые обслуживания БД, которая работает каждый час)

Теперь на определенных действия конечных пользователей, я достигаю сервлет с помощью getServletContext().getRequestDispatcher("/MyServiceServlet").include(request, response), чтобы вызвать некоторые другие дб вещей, но первый время, когда я пытаюсь это сделать, мой сервлет получает экземпляр еще один раз, и метод init() называется (конечно), что приводит к запуску двух похожих потоков. Не идеально!

Кажется, что loadOnStartup=1 не помещает сервлет в контексте сервлета, поэтому, когда я пытаюсь добраться до него диспетчером запроса, он должен быть создан.

Как это может быть? Как исправить это, я просто получил один экземпляр моего сервлета? Мне нужно, чтобы он запускался по приложению, так как Служба начала в init() должна запускаться немедленно.

Приложение развернуто на Tomcat 7.0.57.

+0

Звучит как ошибка в Tomcat. Что делать, если вы обычно получаете RequestDispatcher через HttpServletRequest? Получение его через ServletContext необходимо только тогда, когда оно находится в другом ServletContext (т. Е. Другой веб-браузер, развернутый на одном сервере, вы обычно получаете интересующий ServletContext через ServletContext # getContext()). – BalusC

+0

@BalusC Я попытался использовать объект запроса, чтобы получить RequestDispatcher, и использовать методологию pre 3.x для сопоставления сервлета через web.xml безрезультатно. После немного большей отладки, кажется, это вызов .include (request, response), который создает еще один экземпляр моего Servlet. –

ответ

0

(В методе Init(), поток запускается для выполнения некоторых дб обслуживания, который работает каждый час)

О Господи, замечательно, вы даже верить в утечке памяти? запустить поток в сервлете ?! вам нужно сделать это через context-listener (javax.servlet.ServletContextListener), а не напрямую, это небезопасно.

public class run_thread implements ServletContextListener{ 
    @Override 
     public void contextInitialized(ServletContextEvent sce) {System.out.println("Init: daemon stuffs");/*run teh trhead*/} 
     @Override public void contextDestroyed(ServletContextEvent sce) { 
      System.out.println("Hult: daemon stuffs");/*hult teh trhead*/ 
     } 
    } 

и не подделать, чтобы зарегистрировать его би web.xml

<listener> 
    <listener-class>pack.run_thread</listener-class> 
</listener> 

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

Теперь на определенные действия конечных пользователей, я достигаю сервлета с помощью

Что такое действие пользователя? как? используя другой сервлет? что относительно requets.getRequestDispatcher() вместо getServletContext()

Вы можете поделиться кодом сервлета, будет оценено.

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

  • Нет связанных вопросов^_^