Thanks. This helped me alot. Regards, Behrang S.
On Wed, 15 Dec 2004 00:18:46 +0100, Leon Rosenberg <[EMAIL PROTECTED]> wrote: > Ok, just in case it was more confusing then helping. > Here is the (imho) safe solution (haven't tested it, but it should work > fine): > The isLock method is needed to ensure, that all threads have the same "lock" > value. Volatile should guarantee it, but it's not supported on all vms. You > should call the unlock method after you know, that the processing of the > file is finished. > Another problem, you could have, is to ensure, that the page where the link > is placed is still valid. You can ensure it, by giving your call to the > action a timestamp parameter and check whether it's still the proper > timestamp for the file. > > Here the code (without timestamp): > > public class youraction ...{ > > private volatile boolean lock; > > private void lock() throws AlreadyLockedException{ > if (lock) > throw new AlreadyLockedException(); > > lock = true; > } > > private void unlock(){ > lock = false; > } > > private synchronized boolean isLocked(){ > return lock; > } > > private synchronized void updateXML() throws AlreadyLockedException{ > //double check needed, in case another thread was already > //between first isLocked and updateXML call. > if (isLocked()) > throw new AlreadyLockedException(); > > lock(); > //.... generate the xml file. > unlock(); > > } > > public ActionForward execute( > ActionMapping mapping, > ActionForm af, > HttpServletRequest req, > HttpServletResponse res) > throws Exception { > > //... > if (isLocked()) > return mapping.findForward("noupdate"); > try{ > updateXML(); > return mapping.findForward("updatecomplete"); > }catch(AlreadyLockedException e){ > return mapping.findForward("noupdate"); > } > } > > } > > > > > > > > > > > -----Original Message----- > > > > From: Behrang Saeedzadeh [mailto:[EMAIL PROTECTED] > > > > Sent: Tuesday, December 14, 2004 4:34 PM > > > > To: [EMAIL PROTECTED] > > > > Subject: Preventing concurrent execution of an Action > > > > > > > > Hi > > > > > > > > I've an action that creates an XML file on the server. It's executed > > > > by clicking on a link. I don't want multiple instances of it to be > > > > executed concurrently. > > > > > > > > Does an approach like the following work? > > > > > > > > public class UpdateXmlAction ... > > > > { > > > > private static final boolean locked; > > > > > > > > public void execute(...) { > > > > > > > > if (UpdateXmlAction.locked) { > > > > return; > > > > } > > > > > > > > Synchronized(UpdateXmlAction.class) { > > > > locked = true; > > > > updateXml(); > > > > locked = false; > > > > } > > > > > > > > } > > > > } > > > > > > > > Thanks in advance. > > > > > > > > > > > > -- > > > > > > > > Behrang Saeedzadeh > > > > http://www.jroller.com/page/behrangsa > > > > > > > > --------------------------------------------------------------------- > > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > -- Behrang Saeedzadeh http://www.jroller.com/page/behrangsa --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]