Перезапустить / переустановить сервлет - PullRequest
0 голосов
/ 16 мая 2011

Я хочу перезапустить сервлет (объявленный в web.xml, когда JBoss работает) просто потому, что его init-param указывает на файл, содержимое которого изменилось (то есть был изменен провайдер.fac ниже).

Если есть способ перезагрузить init-param без перезапуска сервлета, это тоже будет хорошо.

Полагаю, я могу изменить сервлет для добавления параметра запроса и функции для перезапуска? Есть ли другой вариант?

 <servlet>
    <servlet-name>coverage</servlet-name>
    <servlet-class>coverageServlet</servlet-class>
    <init-param>
        <param-name>ConfigUrl</param-name>
        <param-value>file:///C:/coverage/providers.fac</param-value>
    </init-param>
    <init-param>
        <param-name>CacheDir</param-name>
        <param-value>coverage</param-value>
    </init-param>         
    <load-on-startup>1</load-on-startup>
</servlet>

Окружающая среда: Сервлет Апи 2.4 JBoss 4.2 Spring Framework 2.5

Ответы [ 4 ]

1 голос
/ 16 мая 2011

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

1 голос
/ 16 мая 2011

Если вы находитесь в jboss, вы можете просто перезапустить сервлет, изменив файл web.xml, если ваш сервлет взорван.В Linux было бы прикосновение.

Не уверен, в каком формате находится ваш файл конфигурации, но если вы пытаетесь автоматически перезагрузить файл конфигурации свойств, я бы посмотрел библиотеку конфигурации commons, которая поддерживает это из коробки.( FileChangedReloadingStrategy )

0 голосов
/ 17 мая 2011

Я бы отделил эти проблемы, вытянув управление файлами из сервлета и поместив его в JBoss JMX ServiceMBean.MBean может следить за изменениями в файле и при необходимости перезагружать его, а также может предоставлять необходимые операции [вызывающему сервлету].Это позволит вам не перезагружать и повторно запускать сервлет (или WAR), которые являются довольно тяжеловесными операциями.

Я придумаю пару операций для FileManager:

public interface FileManagerMBean extends org.jboss.system.ServiceMBean {
   public void setFileName(String fileName);
   public void setCheckFrequency(long freq);
   public String getCoverageData(......);
   public String getProviderData(......);
}

Реализация может быть (в том же пакете, пожалуйста :))

public class FileManager extends org.jboss.system.ServiceMBeanSupport implements FileManagerMBean  {
   public void setFileName(String fileName) { .... }
   public void setCheckFrequency(long freq) { .... }
   public String getCoverageData(......) {  /* impl */ }
   public String getProviderData(......) {  /* impl */ }
   public void startService() throws Exception {
       /* Start a file watcher thread */
   }
   public void stopService() throws Exception {
       /* Stop the file watcher thread */
   }

}

Ваш сервлет может выглядеть так:

// A ref to the MBean
FileManagerMBean fileMgr = null;
// The JMX MBean's ObjectName
ObjectName fileMgrOn = org.jboss.mx.util.ObjectNameFactory.create("portoalet.com:service=FileManager");

public void init() {
   // Get the JBoss MBeanServer
   MBeanServer server = org.jboss.mx.util.MBeanServerLocator.locateJBoss();
   // Create an MBeanInvoker for the service
   fileMgr = (FileManagerMBean)javax.management.MBeanServerInvocationHandler.newProxyInstance(server, fileMgrOn,FileManagerMBean.class, false);    
}

Теперь вы можете использовать fileMgr экземпляр для вызова вашего FileManager MBean, который должен быть потокобезопасным, если вы не синхронизируете доступ к fileMgr .

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

0 голосов
/ 16 мая 2011

2 опции:

  1. Добавить дополнительную проверку на doGet() или doPost(), которая перезагружает файл, когда задан определенный параметр запроса, когда администратор вошел в систему ипредоставьте экран администратора, который вызывает этот запрос.

  2. Перепишите сервлет (или измените деталь на ServletContextListener), чтобы сохранить его в ServletContext вместо переменной экземпляра сервлетаи иметь некоторый экран администратора, который перезагружает файл в ServletContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...