2009-12-10 2 views
9

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

ответ

5

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

Вы можете сделать это в Tomcat. В вашем webapp ваш главный сервлет (тот, который создает другие) должен реализовать 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 или напишите в свой собственный файл.

+0

Это идеальное, большое спасибо. – BigBadOwl

1

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

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

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

0

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

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

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