В Tomcat 5.5 как программно найти конкретный экземпляр сервлета или добавить новые сопоставления? - PullRequest
4 голосов
/ 04 июня 2011

Я понимаю, что обычно это не делается, и я нашел несколько примеров этого вопроса в Интернете с ответами вроде: «Ваш дизайн неправильный, если вам нужно это сделать». Позвольте мне объяснить мою цель.

У меня есть веб-приложение, которое каким-то образом вызывало повторный вызов метода init () одного сервлета. Я не знаю, как это произошло, и я не могу повторить это. Однако из двоичного дампа кучи (вызванного исключением нехватки памяти) из объектов в куче очень ясно, что метод init () определенного сервлета вызывался около 10000 раз, поскольку это единственное место, где эти объекты создано более 10 000 экземпляров объекта, который должен иметь не более одного экземпляра.

Поскольку я не могу воспроизвести то, что произошло на этом одном сайте, я вместо этого хочу принудительно вызывать init () много раз для этого сервлета, предпочтительно через файл JSP, чтобы я мог проверить до и после применения исправления. Тестировать случай «после» легко в теории, потому что я могу изменить код, чтобы (например) вставить этот сервлет в контекст, чтобы я мог получить его и многократно вызывать init (), чтобы доказать, что у этого объекта нет утечки. Но это не помогает мне проверить случай «до» с существующим кодом.

Я не могу просто "(новый MyServlet ()). Init ()" в JSP. Это терпит неудачу, поскольку сервлет создается с нулевым контекстом и не может инициализироваться. В Tomcat 5.5 кажется, что ServletContext.getServlets () всегда возвращает пустое перечисление, а ServletContext.getServlet (String) всегда возвращает ноль.

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

Ответы [ 2 ]

2 голосов
/ 04 июня 2011

Вы уже поняли, что то, что вы пытаетесь, сильно отличается от обычного и далеко от лучших практик, поэтому я не буду вдаваться в подробности по этому вопросу.Сказав это, если вы хотите многократно вызывать MyServlet.init() для экземпляра MyServlet, работающего в Tomcat, вы можете создать подкласс MyServlet, переопределить метод doGet() или doPost(), добавить цикл, который просто вызывает this.init(); 1000 раз, а затем вызвать родительские классы doGet() / doPost().Отредактируйте WEB-INF/web.xml, чтобы использовать ваш подкласс вместо MyServlet.Затем просто нажмите сервлет в вашем веб-браузере и посмотрите, как init() вызывается 1000 раз, прежде чем начать обычную работу со страницей.И вы вообще не изменили исходный класс MyServlet, сохранив свой до теста чистым.

1 голос
/ 06 июня 2011

Вы можете создать экземпляр сервлета, как и любой другой объект класса. Получите конфигурацию сервлета, переопределив метод init(ServletConfig config). И создайте экземпляр класса сервлета столько, сколько хотите, и вызовите init(ServletConfig config) для всех созданных экземпляров.

...