Tracking threads in an application

Hi,
My current application consists of a main thread which spawns multiple threads on startup. The main thread is like a daemon thread which is supposed to continuously run and monitor the threads it had spawned.
As long as the main thread is running it has the handle of all the threads it had spawned.
But if for some reason the main thread dies, how do i get a handle back to the threads the main thread had originally spawned.
I don't have the option to even serialize the child thread info as Thread objects cannot be serialized.
Anyone can suggest a better design or a way to handle this scenario?

I do agree that threads do don't just die. In the eventuality that a exception is thrown and the main comes out of the run method, i need to have a mechanism wherein when i run the main thread ( manager ) i can get retrieve the handle for the threads that were already spawned.
Its basically that a Manager spawns some worker threads and these threads run individually but there is a handle with the Manager. If the Manager thread is killed then I can restart the manager thread and it can resume its monitoring activity by getting the handle back to the child threads..
Am just wondering is the design too complicated if i implement using threads or can i use JMS or some other J2EE technology for the same functionality.

Similar Messages

  • Customizing Track Purchase Order Fiori Application

    Hi,
    We have configured a standard "Track Purchase Order" Fiori application.
    We want to change the Default Filter Criteria from "Last 7days" to "Last 30 days". Is there any configuration available, where we can change this?
    Regards,
    Yuvraj

    Hi Yuvraj,
    You can achieve this by extending controller S2Custom.controller.js .
    Change the default  declaration to:To display  last 30 days items by default
    sFilterLastNDays : 30,
      sFilterWithAlerts : false,
      sSearchText : "",
      sFilterKey : "FILTER30",
      oFilterDialog : null,
    and change the default setting of init method to: to set the default filter from 7 days to 30 days
    this.oFilterDialog.setSelectedPresetFilterItem("FILTER30");
    Regards,
    Trilochan

  • The problem about multi-thread in java application

    i have problem with the multi-thread in java application, i don't know how to stop and restart a thread safely, because the function thread.stop(),thread.suspend() are both deprecated.
    now what i can only do is making the thread check a flag(true or false) to determine whether to start or to stop, but i think this thread will always be in the memory and maybe it will lower the performance of the system, as the program i am developping is working under realtime enviorement.
    please help me about it. thanks !

    hi,
    you can stop a thread by exiting it's run()-method which in terms can be done by checking the interrupted-flag:
    public void run(){
    while(interrupted()){ //if the thread consists of a loop
    or
    public void run(){
    if(interrupted())return;
    if(interrupted())return;
    or by the use of the return-statement anywhere withing the run-method. Afterwards, that is when the thread is no longer needed, you clear all the references to the specific thread object by setting them to null:
    Thread t;
    ... //working
    t.interrupt(); //interrupting
    while(t.isAlive()){
    Thread.yield(); //wait till thread t has stopped
    t=null;
    best regards, Michael

  • Are threads in the application server preemptive?

    Are threads in the application server preemptive or non-preemptive? That is do
    they automatically yield to other threads running in the application server after
    they have run for a certain amount of time or do they only yield when certian
    points in the code are reached (eg when they have completed, when they reach a
    remote call or when they explictly call yield()).

    Green threads (way back in 1.1.8 and so on) was Unix only, and non-preemptive.
    It was also very lumpy and unreliable. Old threading tutorials used to recommend
    calling yield() and suitable points in your code - just like Windows 3.0 all over
    again.
    But all current JVM implementations use OS threading, and are pre-emptive (but
    of course that doesn't stop them being blocked due to synchronization or I/O etc...)
    simon.
    Rob Woollen <[email protected]> wrote:
    It would depend on the underlying JVM or OS. However I've not aware
    of any Java
    implementations that are non-preemptive.
    -- Rob
    Ash Beitz wrote:
    Are threads in the application server preemptive or non-preemptive?That is do
    they automatically yield to other threads running in the applicationserver after
    they have run for a certain amount of time or do they only yield whencertian
    points in the code are reached (eg when they have completed, when theyreach a
    remote call or when they explictly call yield()).

  • Pass messages between main thread and FX application thread

    I'm launching an FX Application thread from a Main thread using Application.launch [outlined here: {thread:id=2530636}]
    I'm trying to have the Aplication thread return information to the Main thread, but Application.launch returns void. Is there an easy way to communicate between the Main thread and the Application thread?
    So far I have googled and found:
    - MOM (Message Orientated Middleware)
    - Sockets
    Any thoughts/ideas/examples are appreciated - especially examples ;) - right now I am looking at using Sockets to show/hide the application and for passing data.
    What is the preferred method? Are there others which I have not found (gasp) via Google?
    Dave.
    Edited by: cr0ck3t on 30-Apr-2013 21:04
    Edited by: cr0ck3t on 30-Apr-2013 21:05

    Is there an easy way to get a reference to these objects from both the Main thread and the FX Application thread - called via Application.launch() from the Main thread? Or do I have to use Sockets or MOM?Not much to do with concurrent programming is what I would call easy. It seems easy - but it's not.
    You can kind of do what you are describing using Java concurrency constructs without using sockets or some Message Oriented Middleware (MOM) package.
    With the Java concurrency stuff you are really implementing your own form or lightweight MOM.
    If you have quite a complex application with lots of messages going back and forth then some kind of MOM package such as camel or ActiveMQ (http://camel.apache.org) is useful.
    You can find a sample of various thread interactions with JavaFX here:
    https://gist.github.com/jewelsea/5500981 "Simulation of dragons eating dwarves using multiple threads"
    Linked code is just demo-ware to try out different concurrency facilities and not necessarily a recommended strategy.
    If your curious, you could take a look at it and try to work out what it is, what it does and how it does it.
    The main pattern followed is that from a blocking queue:
    http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue.html
    Note that once you call launch from the main thread, no subsequent statements in the main method will be run until the JavaFX application shuts down. So you can't really launch from the main thread and communicate with a JavaFX app from the main thread. Instead you need to spawn another thread (or set of threads) for communication with the JavaFX app.
    But really, in most cases, the best solution with concurrency is not to deal with it at all (or at least as little as possible). Write everything in JavaFX, use the JavaFX animation framework for timing related stuff and use the JavaFX concurrency utilities for times when you really need multiple thread interaction.
    http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm
    To get further help, you might be better off describing exactly (i.e. really specific) what you are trying to do in a new question, perhaps with a sample solution in an sscce http://sscce.org

  • Running threads in webdynpro applications

    Hi all,
    We have a requirement to monitor certain conditions and trigger mails accordingly.This monitoring should be on a daily basis.My question is can we run threads in webdynpro applications.
    Please help me.
    Regards,
    Rohit.

    Hi Rohit,
    TimedTrigger UI element automatically and periodically triggers an event with a specified delay. The TimedTrigger UI element is not displayed on the user interface.
    You can use it for your need.
    Rgds,
    Vilish

  • Is there any way to limit the number of Threads running in Application(JVM)

    Hello all,
    is there any way to limit the number of Threads running in Application(JVM)?
    how to ensure that only 100 Threads are running in an Application?
    Thanks
    Mohamed Javeed

    You should definitely use a thread pool for this. You can specify maximum number of threads that can be run. Be note that the thread pool will only limit the number of threads that are submitted to it. So donot call "Thread"s start() method to start thread on your own. Submit it to the pool. To know more, study about executor service and thread pool creation. Actually it will not be more than 20 line code for a class and you might need maximum of 2 such classes, one for threadPool and other one for rejection handler (if you want).
    Just choose the queue used carefully, you just have to pass it as a parameter to the pool.
    You should use "Bounded" queue for limiting threads, but also be careful in using queues like SynchronizedQueue as the queue will execute immediately the threads submitted to it if maximum number of threads have not been running. Otherwise it will reject it and you should use rejection handler. So if your pool has a synchronized queue of size 100, if you submit 101th thread, it will be rejected and is not executed.
    If you want some kind of waiting mechanism, use something like LinkedBlockingQueue. What this will do is even if you want 100 threads, you can specify the queue's size to be 1000, so that you can submit 1000 threads, only 100 will run at a time and the remaining will wait in the queue. They will be executed when each thread already executing will complete. Rejection occurs only when the queue oveflows.

  • Tracking users in the Application.cfc, please help

    Hello;
    I wrote a small tracking system for my web site. I am trying
    to upfrade it to work in CF 8. Here is what I am doing.
    I had this code on the index.cfm page of my site. I am
    attempting to move it to the Application.cfc file. When I do, it
    registers in the DB every time the user hits a page or clicks a
    link. I don't want it to do that. I do want it to tell me when they
    hit the site, and if I can what page they came in on.
    Here is my code:
    <cfquery name="tracking" datasource="my-DB"
    dbtype="ODBC">
    INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
    TRACK_DATE, PageID)
    VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
    #CreateOdbcDateTime(now())#)
    </cfquery>
    My pageID is where I want the information on what page the
    user came in on to go.
    I placed teh query inside a session function code, but it
    doesn't work at all right now, I need to limit the hits counted by
    the Application.cfm, if I place it inside the area of the app that
    is for global variables, it adds info to the DB everytime they
    click a link and I don't want that. As for the entry page of the
    user, I am trying to make it so if someone enters the site lets say
    on the about.cfm page, that is added to the db and so on. Is this
    possible? If so how would I do that?
    Here is my application.cfc code so far:
    <cfcomponent output="false">
    <cfset THIS.name = "my-web">
    <cfset this.sessionManagement="yes">
    <cfset this.clientManagement=true>
    <cffunction name="onApplicationStart" returntype="boolean"
    output="false">
    <cfset APPLICATION.appStarted = now()>
    <cfreturn true>
    </cffunction>
    <cffunction name="onApplicationEnd" returntype="void"
    output="false">
    <cfargument name="appScope" required="True">
    <cflog file="#THIS.name#" text="App ended after
    #dateDiff('n' , ARGUMENTS.appscope.appStarted,now())# minutes.">
    </cffunction>
    <cffunction name="onSessionStart" returntype="query"
    output="true">
    <cfquery name="tracking" datasource="creative"
    dbtype="ODBC">
    INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
    TRACK_DATE)
    VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
    #CreateOdbcDateTime(now())#)
    </cfquery>
    </cffunction>
    <cffunction name="onRequestStart" returntype="boolean"
    output="true">
    <cfset request.datasource = "my-db">
    <cfset sitePath = "
    http://www.myweb">
    <!--- this is where I was putting the tracking code and it
    added to the DB everytime someone clicked a link. not what I want
    --->
    <!--- Start True Url Variables --->
    <cfloop
    list="#removeChars(cgi.path_info,1,len(cgi.script_name))#"
    delimiters="/" index="variableSet">
    <cfscript>
    variableName = "url." & listGetAt(variableSet,1,'.');
    expression = listGetAt(variableSet,2,'.');
    </cfscript>
    <cfparam name="#variableName#" default="#expression#">
    </cfloop>
    <!--- Finish True Url Variables --->
    <cfreturn true>
    </cffunction>
    </cfcomponent>
    Thank you.
    Phoenix

    I did a dump and got it to error out, so it is recognizing
    the session, but it doesn't add any info to the DB. I also had to
    change it, I had it like this:
    <cffunction name="onSessionStart" returntype="query"
    output="true">
    <cfquery name="tracking" datasource="my-db"
    dbtype="ODBC">
    INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
    TRACK_DATE)
    VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
    #CreateOdbcDateTime(now())#)
    </cfquery>
    </cffunction>
    Changed it to this:
    <cffunction name="onSessionStart" returntype="any"
    output="true">
    <cfquery name="tracking" datasource="creative"
    dbtype="ODBC">
    INSERT INTO tracking (REMOTE_ADDR, HTTP_USER_AGENT,
    TRACK_DATE)
    VALUES('#REMOTE_ADDR#', '#HTTP_USER_AGENT#',
    #CreateOdbcDateTime(now())#)
    </cfquery>
    </cffunction>
    it was erroring on the query attribute before in the session
    function. Even that change didn't get it to work properly.

  • Turning off tracking and using existing applications in 10.5.6

    Hi
    I've just been forced to upgrade to osx 10.5.6, there;s no actual manual, just promo material telling you how easy it is to do all these things. Really insulting when you're trying to find out how use it. Particularly, i want to turn off the thing on the left of the finder window where it tracks everything you do. Anybody know how to do it? I also can't figure out how to run older programs, no way i can afford to upgrade everything, keep getting messages that my application won't run under the new os. What is going on? I'm on the verge of moving back to pc.
    thanks

    asdfg234,
    What you see at the left side of the Finder window is the "Sidebar." It isn't there to "track" you. Rather, it is a tool to allow quick and easy navigation within the file system. It contains shortcuts to various important locations, such as your "Desktop," your "Documents" folder, and your "HOME" folder (which contains the many of the others). You can also drag any file or folder you choose into the Sidebar to customize it. If you insert a CD/DVD or mount an external drive, it shows up in the Sidebar with a convenient eject button. If you are on a network with other computers that provide "services," such as shared printers or file sharing, these computers show up here.
    The Sidebar is very handy to have around. However, you can dismiss it entirely if you like. Click the little button in the upper-right hand corner of the Finder window. This dismisses both the Sidebar and the Toolbar (at the top of the window), and causes the Finder to act much as OS 9's Finder did, opening everything in a new window instead of in the same window.
    Which brings me to my question: Did you migrate from OS 9?? If so, none of your old applications will work. Leopard (10.5) did away with "Classic" support, and OS 9 can no longer be run on top of OS X. This is a good thing! OS X applications are far more powerful than their OS 9 counterparts, and generally easier to use. Adapt.
    Scott

  • Joining separate threads in different application instances

    Is there any way to have a thread running on a machine that will pick up any new request?
    If application A is running all day on a server, can I start another instance via command line
    that will join that 1st thread/queue, to use it resources, like a connection pool?
    Is that just a servlet with a wider scope?

    What you are talking about really is starting an application in JVM A, and then running a small auxiliary command in JVM B that communicates with A and tells it to start another thread to perform some task. The communications part of this is done with sockets, RMI, etc, and the threading part is done with a Thread, or the services in java.util.concurrent.

  • JFrame thread in ClientServer application?

    I am creating a client/server application, mostly in Java.
    It all runs on one box.
    The reason for the client/server setup is that the application will consist of modules in different languages
    with one module written in Visual Basic with a TCP/IP interface.
    I will have something like this:
    myJavaServer
    |_ myVBModule
    |_ myC++Module
    |_ myJavaModule
    myJavaServer is a thread.
    myJavaServer and myVBModule will communciate via TCP/IP, in which each has a state machine
    myJavaServer and myC++Module will probably communicate via the JNI.
    myJavaServer will simply call myJavaModule methods.
    myJavaServer calls myVBModule, myC++Module, and myJavaModule sequentially,
    i.e. it can't call myC++Module until myVBModule is done, can't call myJavaModule until myC++Module is done, and when myJavaModule is done, it will loop back and call myVBModule.
    Each is acting on the same set of data.
    One part of this data is a 2D array which I would like to display and refresh once each time around the loop
    The display will be some JPanels on a JFrame.
    How do I best integrate this with the rest of the program?
    Do I make it a separate Thread?

    http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html
    http://java.sun.com/products/jfc/tsc/articles/threads/threads2.html
    http://java.sun.com/products/jfc/tsc/articles/threads/threads3.html

  • Stuck thread in adf application with weblogic

    hi every body
    I am working in JDev 11.1.1.4 and weblogic 10.3.4
    when I deploy my Application in my production weblogic
    after some time (it does not constant it is variable) I got warnning on the server
    when I check the server I got some stuck thread
    any idea or notes how can I know what is the reason of these stuck threads?
    is there any objects have thread unsafe issue, resource contention or race condition in ADF?
    BR,
    Alaa

    actully I do that guys
    but what I get does not have any related to my application
    even those http request does not request the same page
    this is the stuck thread when I dump
    "[STUCK] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'" id=61 idx=0xe8 tid=13369 prio=1 alive, waiting, native_blocked, daemon
    -- Waiting for notification on: oracle/adfinternal/controller/util/RequestLock@0x88e06b58[fat lock]
    at jrockit/vm/Threads.waitForNotifySignal(JLjava/lang/Object;)Z(Native Method)
    at jrockit/vm/Locks.wait(Locks.java:1973)[inlined]
    at java/lang/Object.wait(Object.java:485)[inlined]
    at oracle/adfinternal/controller/util/RequestLock.lock(RequestLock.java:42)[inlined]
    at oracle/adfinternal/controller/state/RootViewPortContextImpl.lockViewPortRequestLock(RootViewPortContextImpl.java:604)[optimized]
    ^-- Lock released while waiting: oracle/adfinternal/controller/util/RequestLock@0x88e06b58[fat lock]
    at oracle/adfinternal/controller/state/ControllerState.initializeRequest(ControllerState.java:833)[inlined]
    at oracle/adfinternal/controller/state/ControllerState.initializeRequest(ControllerState.java:754)[inlined]
    at oracle/adfinternal/controller/application/AdfcConfigurator.beginRequest(AdfcConfigurator.java:50)[optimized]
    at org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl._startConfiguratorServiceRequest(GlobalConfiguratorImpl.java:562)[inlined]
    at org/apache/myfaces/trinidadinternal/config/GlobalConfiguratorImpl.beginRequest(GlobalConfiguratorImpl.java:212)[optimized]
    at org/apache/myfaces/trinidadinternal/webapp/TrinidadFilterImpl.doFilter(TrinidadFilterImpl.java:155)[optimized]
    at org/apache/myfaces/trinidad/webapp/TrinidadFilter.doFilter(TrinidadFilter.java:92)[optimized]
    at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)[optimized]
    at oracle/adf/library/webapp/LibraryFilter.doFilter(LibraryFilter.java:175)[optimized]
    at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)[optimized]
    at oracle/security/jps/ee/http/JpsAbsFilter$1.run(JpsAbsFilter.java:111)[optimized]
    at jrockit/vm/AccessController.doPrivileged(AccessController.java:254)[inlined]
    at oracle/security/jps/util/JpsSubject.doAsPrivileged(JpsSubject.java:313)[inlined]
    at oracle/security/jps/ee/util/JpsPlatformUtil.runJaasMode(JpsPlatformUtil.java:413)[inlined]
    at oracle/security/jps/ee/http/JpsAbsFilter.runJaasMode(JpsAbsFilter.java:94)[inlined]
    at oracle/security/jps/ee/http/JpsAbsFilter.doFilter(JpsAbsFilter.java:161)[optimized]
    at oracle/security/jps/ee/http/JpsFilter.doFilter(JpsFilter.java:71)[optimized]
    at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)[optimized]
    at oracle/dms/servlet/DMSServletFilter.doFilter(DMSServletFilter.java:136)[optimized]
    at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)[optimized]
    at weblogic/servlet/internal/RequestEventsFilter.doFilter(RequestEventsFilter.java:27)[optimized]
    at weblogic/servlet/internal/FilterChainImpl.doFilter(FilterChainImpl.java:56)[inlined]
    at weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3715)[inlined]
    at weblogic/servlet/internal/WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3681)[optimized]
    at weblogic/security/acl/internal/AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)[optimized]
    at weblogic/security/service/SecurityManager.runAs(SecurityManager.java:120)[inlined]
    at weblogic/servlet/internal/WebAppServletContext.securedExecute(WebAppServletContext.java:2277)[inlined]
    at weblogic/servlet/internal/WebAppServletContext.execute(WebAppServletContext.java:2183)[optimized]
    at weblogic/servlet/internal/ServletRequestImpl.run(ServletRequestImpl.java:1454)[optimized]
    at weblogic/work/ExecuteThread.execute(ExecuteThread.java:207)[optimized]
    at weblogic/work/ExecuteThread.run(ExecuteThread.java:176)
    at jrockit/vm/RNI.c2java(IIIII)V(Native Method)
    -- end of trace
    any another ideas?
    BR,
    Alaa

  • Tracking Usage of an application that uses EAI Object Manager

    Hi,
    We have had created for us an application that works using Siebel EAI.
    I have been asked to implement some tracking of usage, so that we can see who is using the application.
    Building on some work that we use in the main application, I have an executable file that essentially looks in the Siebel log directory for a string like this:
    oldUser=SiebelAnonUser, newUser=UsersUserName
    This works fine to a point, except not every user seems to have an entry like this one.
    Some do/some don't and some do some days and not others. It seems quite random.
    Instead, the users frequently have an entry like this instead of the SiebelAnonUser:
    oldUser=someUsersUserName, newUser=anotherUsersUserName
    Can anyone explain how this works, and why sometiumes we see an entry with SiebelAnonUser in and other times not?
    Otherwise, does anyone have a good way of tracking usage of EAI? Or something that would be written to the logs that we can track usage on?

    Hi Rave,
    The error that I am getting is "Cannot Create ActiveX Component".  It's occurring when I try to create the object "AFormAut.App".  Below is the line of code that is throwing the error.
    _formapp = DirectCast(CreateObject("AFormAut.App"), AFORMAUTLib.AFormApp)
    Thanks,
    Aaron

  • Oraclient9i.dll error in multi threaded delphi server application

    I created a multi threaded server application in delphi using oracle9i and indy server components. When I run my application, I am getting an error "oraclient9i.dll" error when executing my SQL statements. I have check communication between my server application and the client application without using oracle and its working fine, its only when I started executing SQL statements when I got this error.
    Can anybody help me with this problem or point me to the right direction on how to resolve this issue.
    thanks

    > I have tried what you suggested. I have created a
    seperate TOracleSession on each thread that I create
    on the OnConnect event however I am having Problems
    using the oraclesession created on the OnExecute
    event. Somehow it is still executing the SQL that I
    have created on the main form where I first opened an
    oraclesession component created on the main form.
    It sounds then like the TOracleSession object in the thread is a copy of the one in the main thread/form.
    > Do you think that It would work if I create an
    instance of the TOracleDatasets and TOracleQuery on
    the OnExecute event and also at the same time create
    my TOracleSession on this event and continue
    processing the data receive from the client server.
    I've never used the Indy components for threading. The default TThread class worked just fine for me.
    What I used to do is define the session and database objects as privates in my new thread class (let's call it TThreadSQL) - which was subclassed from TThread.
    The constructor of this new TThreadSQL class did the following (writing here purely from memory - have not done Delphi for some time now): constructor TThreadSQL.Create( TNSalias, username, password : string );
    // constructor is called with the Oracle session connection details
    begin
      inherited Create; // call the parent class constructor
      CreateOracleSession; // call own private method to create an Oracle connection
    end;
    The CreateOracleSession method would then:
    - create a BDE Session (TSession) object
    - create a BDE Database (TDatabase) object, using the BDE Oracle native driver and an Oracle TNS alias plus username and password for connection
    The destructor would close the connection. The Execute method which is used to fire up the thread, would use a TQuery object (or whatever) to execute a SQL using it owns connection.

  • Thread-Safe BC4J Application

    Hello,
    I have an BC4J-based application, based on BC4J9.0.2. I'm considering to upgrade my BC4J library to upper version to make my application more thread-safe.
    How can I make thread-safe application using BC4J? Is there any specific Rule?
    Thank you.

    Hi,
    Its hard to define a single rule since it depends upon how each application is using threads. I have included some thoughts about the most common scenarios for web clients below:
    The BC4J client wizards (datatags, struts, JClient) will help you generate threadsafe applications. The general rule when writing a web client is to ensure that each "user", as represented by an HttpSession instance, has their own ApplicationModule instance. Using the ApplicationModule datatag or the BC4J/Struts framework will guarantee this.
    Beyond this it may also be necessary to coordinate multiple concurrent requests from a single client (imagine a user pounding on the browser refresh button). One approach for solving this problem is to synchronize requests on some sort of session context. The ApplicationModule tag supports a latching mode (see the lock attribute) which performs this by synchronizing access to the SessionCookie (cached in session, used to acquire ApplicationModule instance). Support for latching will also be available in Struts in the 9.0.3.3 and later timeframe.
    Hope this helps,

Maybe you are looking for