Jetty: динамическое удаление зарегистрированного сервлета.

Я создал и запустил сервер Jetty с WebAppContext. Я также могу добавить сервлет в WebAppContext с помощью метода addServlet. Но я хочу динамически удалить этот сервлет. Как я могу это сделать ? Что-то вроде removeServlet() не предусмотрено в WebAppContext.


person nattu    schedule 01.03.2011    source источник


Ответы (1)


Вам нужно сделать это вручную (вероятно, должен быть метод удобства, но его нет)

В Jetty 7 это будет примерно так (не проверено):

public void removeServlets(WebAppContext webAppContext, Class<?> servlet)
{
   ServletHandler handler = webAppContext.getServletHandler();

   /* A list of all the servlets that don't implement the class 'servlet',
      (i.e. They should be kept in the context */
   List<ServletHolder> servlets = new ArrayList<ServletHolder>();

   /* The names all the servlets that we remove so we can drop the mappings too */
   Set<String> names = new HashSet<String>();

   for( ServletHolder holder : handler.getServlets() )
   {
      /* If it is the class we want to remove, then just keep track of its name */
      if(servlet.isInstance(holder.getServlet()))
      {
          names.add(holder.getName());
      }
      else /* We keep it */
      {
          servlets.add(holder);
      }
   }

   List<ServletMapping> mappings = new ArrayList<ServletMapping>();

   for( ServletMapping mapping : handler.getServletMappings() )
   {
      /* Only keep the mappings that didn't point to one of the servlets we removed */
      if(!names.contains(mapping.getServletName()))
      {
          mappings.add(mapping);
      }
   }

   /* Set the new configuration for the mappings and the servlets */
   handler.setServletMappings( mappings.toArray(new ServletMapping[0]) );
   handler.setServlets( servlets.toArray(new ServletHolder[0]) );

}
person Tim    schedule 03.03.2011
comment
Нет проблем, но если вам нравится ответ, вы должны нажать на галочку (в правом верхнем углу ответа), чтобы отметить его как принятый ответ. Это лучший способ сказать спасибо за переполнение стека. - person Tim; 04.03.2011
comment
Привет, Тим. Хотя это решение работает, мне интересно, как здесь происходит переназначение сервлетов. Этот код переустанавливает все сервлеты заново каждый раз, когда он вызывается? Кажется, что было бы проблематично, если бы сервер отключил все сервлеты только для того, чтобы удалить один из них и восстановить остальные. Если я прав, это может привести к условиям гонки. - person James Manes; 05.03.2016