2011-05-16 95 views
0

我想重新啓動一個servlet(在JBoss運行時在web.xml中聲明),因爲它的init-param指向一個內容已更改的文件(即下面的providers.fac已被修改) 。重新啓動/重新啓動一個servlet

如果有一種方法可以在不重新啓動servlet的情況下重新加載init-param,那也不錯。

我想我可以修改這個servlet來添加一個請求參數和函數來重啓它自己嗎? 還有其他選擇嗎?

<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> 

環境: Servlet API的2.4 的JBoss 4.2 Spring框架2.5

回答

0

2個選擇:

  1. 添加額外的檢查上doGet()doPost()其中重新加載當特定請求參數被設定,而管理員用戶登錄並提供管理屏幕它調用該請求的文件。

  2. 重寫的servlet(或重構部分ServletContextListener)以將其存儲在ServletContext而不是作爲servlet的一個實例變量,並有一些管理屏幕,其在重新加載ServletContext該文件。

+0

謝謝,我最終這樣做了。 – portoalet 2011-05-17 03:28:22

1

如果你是在JBoss中,你可以簡單地重新啓動通過改變web.xml文件,如果你的servlet被爆炸的servlet。在Linux上觸摸會做。

不知道什麼格式的配置文件是,但如果你想自動重新加載一個屬性配置文件,我想看看公地配置LIB支持此開箱即用(FileChangedReloadingStrategy

+0

謝謝,我會嘗試FilechangedReloadingStrategy,因爲手動重啓是不可接受的。 – portoalet 2011-05-16 06:56:27

1

如果您計劃在一天/一週內自動重啓你的servlet並多次重啓你的servlet,你應該確保你的permgen足夠處理servlet重載。有些情況下,我在製作過程中做了這些事情,並因PermGen的許多錯誤而讓自己陷入困境。

+0

你重新啓動了一個servlet還是全部?是的,當我多次手動重新部署* .war時,我看到一些PermGen錯誤 – portoalet 2011-05-16 07:20:33

+0

@portoalet這是一個servlet,但是是一個控制器servlet,完成所有繁重的工作 – 2011-05-16 07:32:43

0

我將文件管理從servlet中拉出來放到JBoss JMX ServiceMBean中,以分開這些問題。 MBean可以在需要時關注文件的更改和重新加載,還可以向[調用的servlet]公開所需的操作。這將允許您不必重新加載和重新啓動相當重量級操作的servlet(或WAR)。

我會發明瞭幾個操作的文件管理:

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 */ 
    } 

} 

你的servlet可能是這樣的:

// 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

我意識到這看起來有些過度設計,但你真的應該將servlet的功能與管理文件的功能分開。