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]