Динамически добавить сервлет в servletConfig

У меня есть веб-приложение Java, которое использует архитектуру плагинов. Я хотел бы знать, есть ли у кого-нибудь решение, где одним можно добавить сервлет с отображением serlvet в servletconfig во время работы веб-приложения? Идея в том, что класс можно добавить в папку /WEB-INF/classes и сделать активным в качестве сервлета без перезапуска веб-приложения. По той же самой природе, если пользователь выбирает удалить "плагин", тогда пусть код удалит класс из servletconfig.

3 ответа

Решение

Для этого не существует стандартного Servlet API.

Вы можете сделать это в Tomcat. В вашем веб-приложении ваш главный сервлет (тот, который создает другие) должен реализовывать ContainerServlet так что вы можете получить Wrapper объект. После того, как вы установили свой файл класса, вы можете сделать следующие вызовы,

Context context = (Context) wrapper.getParent();
Wrapper newWrapper = context.createWrapper();
newWrapper.setName(name);
newWrapper.setLoadOnStartup(1);
newWrapper.setServletClass(servletClass);
context.addChild(newWrapper);
context.addServletMapping(pattern, name);

Эти вызовы создают сервлет на лету. Вам нужно найти способ сохранить эту информацию. Вы можете сделать это, обновив web.xml или запишите свой собственный файл.

Добавлять и удалять классы в / из запущенного приложения сложно. Вы можете посмотреть на JRebel для коммерческого решения.

Если у ваших пользователей нет очень продолжительных разговоров / сеансов, возможно, перезапуск вашего веб-приложения может быть достаточно быстрым, чтобы они этого не заметили. Если это сделает это за вас, тогда проблема станет довольно легкой.

Предполагая, что вы используете Tomcat, вы можете настроить свой сервер с reloadable=true и оно перезапустит ваше приложение всякий раз, когда вы выбрасываете новое web.xml в webapps каталог. Вы можете добавить новые классы к WEB-INF/classes каталог, а затем обновить web.xml, это должно работать нормально. Удаление классов может быть сложнее, если эти классы используются. Возможно, вы захотите выполнить двухэтапный процесс, в котором вы сначала развернете web.xml который больше не маршрутизирует к данному классу сервлета, затем немного подождите, пока пользователи класса не уйдут, а затем удалите класс и повторно разверните обновленный web.xml снова.

Я не думаю, что вы можете сделать это динамически, но вы можете попытаться сделать сервлет активным или неактивным, используя предварительно настроенный фильтр. Сделайте фильтр, проверяющий значение, которое вы можете динамически изменять в базе данных или в файловой системе, и сообщите ему, как перенаправить запрос, если сервлет "выключен".

Я думаю, что было бы грубым просто отключить сервлет, не предоставляя пользователям какую-либо обратную связь.

Другие вопросы по тегам