У меня есть сервлет, который аннотированный так:RequestDispatcher инициализирует сервлет, который уже инстанцированный через нагрузку на старте
@WebServlet(value="/MyServiceServlet", loadOnStartup=1)
Это приводит к Servlet быть инстанцированный при запуске приложения и его init()
метод который вызывается , Отлично! (В методе init()
, Нить начала выполнять некоторые обслуживания БД, которая работает каждый час)
Теперь на определенных действия конечных пользователей, я достигаю сервлет с помощью getServletContext().getRequestDispatcher("/MyServiceServlet").include(request, response)
, чтобы вызвать некоторые другие дб вещей, но первый время, когда я пытаюсь это сделать, мой сервлет получает экземпляр еще один раз, и метод init()
называется (конечно), что приводит к запуску двух похожих потоков. Не идеально!
Кажется, что loadOnStartup=1
не помещает сервлет в контексте сервлета, поэтому, когда я пытаюсь добраться до него диспетчером запроса, он должен быть создан.
Как это может быть? Как исправить это, я просто получил один экземпляр моего сервлета? Мне нужно, чтобы он запускался по приложению, так как Служба начала в init()
должна запускаться немедленно.
Приложение развернуто на Tomcat 7.0.57.
Звучит как ошибка в Tomcat. Что делать, если вы обычно получаете RequestDispatcher через HttpServletRequest? Получение его через ServletContext необходимо только тогда, когда оно находится в другом ServletContext (т. Е. Другой веб-браузер, развернутый на одном сервере, вы обычно получаете интересующий ServletContext через ServletContext # getContext()). – BalusC
@BalusC Я попытался использовать объект запроса, чтобы получить RequestDispatcher, и использовать методологию pre 3.x для сопоставления сервлета через web.xml безрезультатно. После немного большей отладки, кажется, это вызов .include (request, response), который создает еще один экземпляр моего Servlet. –