Seems like somebody ought to point out that calling lifecycle methods (like
Servlet.init and Servlet.destroy) from app code is generally a bad idea. OTOH,
if it works for you...

Quoting Pady Srinivasan <[EMAIL PROTECTED]>:

> 
> I made a small change to the code where setting WEB-INF in the classpath is
> not required.
> 
>   private long lastModified = 0;
>   private void reloadConfig(HttpServletRequest request) {
>       if ( System.getProperty("DEVELOPMENT_MODE") != null ) {
>         try {
>             File f = new
> File(request.getSession().getServletContext().getRealPath("/WEB-INF/struts-c
> onfig.xml"));
>              if ( f.lastModified() != lastModified ) {
>                 ActionServlet as = ( (ActionServlet)
> request.getSession().getServletContext().getAttribute(
>                     Globals.ACTION_SERVLET_KEY));
>                 as.destroy();
>  
> request.getSession().getServletContext().removeAttribute(Globals.REQUEST_PRO
> CESSOR_KEY);
>                 as.init();
>                 System.out.println("Reload ok.");
>             }
>             lastModified = f.lastModified();
>         }
>         catch (Exception ex) {
>             ex.printStackTrace();
>         }
>       }
>   }
> 
> Thanks
>  
> -- pady
> [EMAIL PROTECTED]
>  
> 
> -----Original Message-----
> From: Pady Srinivasan [mailto:[EMAIL PROTECTED] 
> Sent: Thursday, March 25, 2004 9:37 AM
> To: Struts Users Mailing List
> Subject: RE: Automatically detecting struts-config changes and reload app.
> 
> 
> I used your code ( Thanks ) and I finally got it to work with a Filter. We
> have a login filter in our app. So I added a method which runs only in
> development mode. 
> 
> * Set the DEVELOPMENT_MODE system property during development.
> * Add the WEB-INF directory to the classpath. ( does Tomcat include this in
> the classpath ? )
> * Call this method from the doFilter() method in your filter.
> 
>   private long lastModified = 0;
>   private void reloadConfig(HttpServletRequest request) {
>       if ( System.getProperty("DEVELOPMENT_MODE") != null ) {
>         try {
>             URL url = LoginFilter.class.getResource("/struts-config.xml");
>             if ( url == null )
>                 return;
>             File f = new File(url.getFile());
>             if ( f.lastModified() != lastModified ) {
>                 ActionServlet as = ( (ActionServlet)
> request.getSession().getServletContext().getAttribute(
>                     Globals.ACTION_SERVLET_KEY));
>                 as.destroy();
>  
> request.getSession().getServletContext().removeAttribute(Globals.REQUEST_PRO
> CESSOR_KEY);
>                 as.init();
>                 System.out.println("Reload ok.");
>             }
>             lastModified = f.lastModified();
>         }
>         catch (Exception ex) {
>             ex.printStackTrace();
>         }
>       }
>   }
> }
> 
> 
> 
> 
> Thanks
>  
> -- pady
> [EMAIL PROTECTED]
>  
> 
> -----Original Message-----
> From: Leonardo Francalanci [mailto:[EMAIL PROTECTED] 
> Sent: Thursday, March 25, 2004 7:19 AM
> To: Struts Users Mailing List
> Subject: R: Automatically detecting struts-config changes and reload app.
> 
> I wrote the following on 01/23/2004 on the mailing list, but nobody cared...
> 
> 
> 
> 
> 
> I wrote a servlet to trigger off a reload of the struts-config.xml.
> 
> The servlet is:
> 
>       protected void doGet(..) {
> 
>               ActionServlet as =
> ((ActionServlet)request.getSession().getServletContext().getAttribute(Global
> s.ACTION_SERVLET_KEY));
>               as.destroy();
> 
> request.getSession().getServletContext().removeAttribute(Globals.REQUEST_PRO
> CESSOR_KEY);
>               as.init();
> 
>               new PrintStream(response.getOutputStream()).println("Reload
> ok.");
>       }
> 
> 
> Now my questions...
> 
> 1) Is there another way to trigger off a reload without using the Tomcat's
> reload
> function (which takes a very long time and leaves db connections open?)
> 
> 2) I had to call removeAttribute(Globals.REQUEST_PROCESSOR_KEY) because the
> destroy method
> of the ActionServlet doesn't do it. Here is the code (from
> ActionServlet.destroyModules()):
> 
> [..]
>             if (value instanceof ModuleConfig) {
>                 ModuleConfig config = (ModuleConfig) value;
>                 getRequestProcessor(config).destroy();
> 
>                 getServletContext().removeAttribute(name);
> 
> I think there should be something like
> 
> getServletContext().removeAttribute(Globals.REQUEST_PROCESSOR_KEY +
> config.getPrefix());
> 
> If I don't remove the attribute following requests will not work (because of
> the code
> in ActionServlet.getRequestProcessor)
> 
> Is this a bug?
> 
> 
> 3) Don't you think that something like that could be useful? I mean, if
> answer to 1) is NO,
> wouldn't be useful to have a configuration reloader with struts?
> 
> 4) Calling actionServlet.destroy() and actionServlet.init() is enough to
> re-load the whole
> struts-config.xml?

-- 
Kris Schneider <mailto:[EMAIL PROTECTED]>
D.O.Tech       <http://www.dotech.com/>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to