You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@struts.apache.org by Dan Jacobs <dj...@modelobjects.com> on 2003/12/01 14:58:51 UTC
dynamic reloading of struts-config and classes for Struts 1.1 and
JPlates 3.0 - 99%
Hi all,
I have implemented a scheme for dynamically reloading classes and struts
configuration files for JPlates 3.0.1 and Struts 1.1, and welcome anyone
interested to try it out. Everything you need is in the JPlates trial
download at http://www.jplates.com, and the config setup is described in
the examples on the site and in the Java-doc. The scheme is designed to
work even if you don't use JPlates.
As indicated in the subject line, this is only a 99% solution so far,
even if you don't do anything in your code to thwart the strategy
(things to avoid are enumerated in the Java-doc). Here's how it works.
1. There's a subclass of ActionServlet that uses a class-loader-manager
to watch for changes in the WEB-INF directory tree of the
web-application. It only looks for changes when it responds to the
first request of a new session (that's both for performance reasons and
to avoid class-loader collisions within a session). You can override
the out-of-date checking behavior by providing your own FileFilter in a
subclass.
2. The class-loader takes over loading classes and other resources from
the WEB-INF/classes directory. It does not do anything with jar files
in the WEB-INF/lib directory, since in most cases those files are kept
open for direct file access.
3. When changes are detected and a new class-loader is constructed, the
ActionServlet subclass re-initializes itself, re-loading the
configuration XML files, etc. This isn't a very straightforward thing
to do, and there's probably code in there that's completely Struts-1.1
specific.
This scheme has been fairly well tested, but only under Tomcat 4.x and
5.0, and not in a production multi-client environment.
PLEASE NOTE:
I have noticed one peculiar problem that I haven't been able to track
down. If you modify classes in the WEB-INF/classes directory and start
a new session, the changes take effect immediately. But if you modify
your struts-config.xml file and start a new session, those changes are
not seen the first time. If you touch the file again and start another
session, the changes are then seen. In fact, every even numbered change
to the struts-config file works properly. If anyone has any insights
about that, I'd be very interested. I've seen similar behavior using
custom class-loaders with Tomcat, but don't know what causes it.
I expected that some J2EE containers will put up a fuss about this
ActionServlet subclass creating new class-loaders. You'll have to grant
permissions in that case. I also anticipate class-loader collisions
with multiple concurrent sessions, and I'm working on a design to
address that problem.
Please try this out. I've already found it to be a great time-saver,
despite its current limitations, and I'd like to make it even more
useful based on your feedback.
All the best,
Dan Jacobs
President, JPlates Inc.