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]

Reply via email to