|
|||||||||
| Home >> All >> org >> apache >> derby >> impl >> services >> [ daemon overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
org.apache.derby.impl.services.daemon
Class BasicDaemon

java.lang.Objectorg.apache.derby.impl.services.daemon.BasicDaemon
- All Implemented Interfaces:
- org.apache.derby.iapi.services.daemon.DaemonService, java.lang.Runnable
- public class BasicDaemon
- extends java.lang.Object
- implements org.apache.derby.iapi.services.daemon.DaemonService, java.lang.Runnable
- extends java.lang.Object
A BasicDaemon is a background worker thread which does asynchronous I/O and general clean up. It should not be used as a general worker thread for parallel execution. One cannot count on the order of request or count on when the daemon will wake up, even with serviceNow requests. Request are not persistent and not recoverable, they are all lost when the system crashes or is shutdown. System shutdown, even orderly ones, do not wait for daemons to finish its work or empty its queue. Furthermore, any Serviceable subscriptions, including onDemandOnly, must tolerate spurrious services. The BasicDaemon will setup a context manager with no context on it. The Serviceable object's performWork must provide useful context on the context manager to do its work. The BasicDaemon will wrap performWork call with try / catch block and will use the ContextManager's error handling to clean up any error. The BasicDaemon will guarentee serviceNow request will not be lost as long as the jbms does not crash - however, if N serviceNow requests are made by the same client, it may only be serviced once, not N times. Many Serviceable object will subscribe to the same BasicDaemon. Their performWork method should be well behaved - in other words, it should not take too long or hog too many resources or deadlock with anyone else. And it cannot (should not) error out. The BasicDaemon implementation manages the DaemonService's data structure, handles subscriptions and enqueues requests, and determine the service schedule for its Serviceable objects. The BasicDaemon keeps an array (Vector) of Serviceable subscriptions it also keeps 2 queues for clients that uses it for one time service - the 1st queue is for a serviceNow enqueue request, the 2nd queue is for non serviceNow enqueue request. This BasicDaemon services its clients in the following order: 1. any subscribed client that have made a serviceNow request that has not been fulfilled 2. serviceable clients on the 1st queue 3. all subscribed clients that are not onDemandOnly 4. serviceable clients 2nd queue
| Field Summary | |
private boolean |
awakened
|
protected org.apache.derby.iapi.services.context.ContextManager |
contextMgr
|
protected org.apache.derby.iapi.services.context.ContextService |
contextService
|
private int |
earlyWakeupCount
|
private java.util.List |
highPQ
Queues for the work to be done. |
private boolean |
inPause
|
private long |
lastServiceTime
|
private int |
nextService
which subscribed clients to service next? only accessed by daemon thread |
private java.util.List |
normPQ
|
private int |
numClients
|
private static int |
OPTIMAL_QUEUE_SIZE
|
private boolean |
running
|
private boolean |
stopped
|
private boolean |
stopRequested
|
private java.util.Vector |
subscription
|
private boolean |
waiting
true if I'm waiting, if this is false then I am running and a notify is not required. |
| Fields inherited from interface org.apache.derby.iapi.services.daemon.DaemonService |
DaemonOff, DaemonTrace, TIMER_DELAY |
| Constructor Summary | |
BasicDaemon(org.apache.derby.iapi.services.context.ContextService contextService)
make a BasicDaemon |
|
| Method Summary | |
void |
clear()
Get rid of all queued up Serviceable tasks. |
boolean |
enqueue(org.apache.derby.iapi.services.daemon.Serviceable newClient,
boolean serviceNow)
Request a one time service from the Daemon. |
private boolean |
inPause()
|
protected ServiceRecord |
nextAssignment(boolean urgent)
|
void |
pause()
Pause. |
private boolean |
rest()
Returns true if awakened by some notification, false if wake up by timer |
void |
resume()
Resume service after a pause |
void |
run()
This method will be called by whoever wishes to run your class implementing Runnable. |
protected void |
serviceClient(ServiceRecord clientRecord)
|
void |
serviceNow(int clientNumber)
Service this subscription ASAP. |
void |
stop()
Finish what we are doing and at the next convenient moment, get rid of the thread and make the daemon object goes away if possible. |
private boolean |
stopRequested()
|
int |
subscribe(org.apache.derby.iapi.services.daemon.Serviceable newClient,
boolean onDemandOnly)
Add a new client that this daemon needs to service |
void |
unsubscribe(int clientNumber)
Get rid of a client from the daemon. |
void |
waitUntilQueueIsEmpty()
|
protected void |
wakeUp()
|
private void |
work(boolean urgentOnly)
|
private void |
yield()
|
| Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
numClients
private int numClients
OPTIMAL_QUEUE_SIZE
private static final int OPTIMAL_QUEUE_SIZE
- See Also:
- Constant Field Values
subscription
private final java.util.Vector subscription
contextService
protected final org.apache.derby.iapi.services.context.ContextService contextService
contextMgr
protected final org.apache.derby.iapi.services.context.ContextManager contextMgr
highPQ
private final java.util.List highPQ
- Queues for the work to be done.
These are synchronized by this object.
normPQ
private final java.util.List normPQ
nextService
private int nextService
- which subscribed clients to service next?
only accessed by daemon thread
awakened
private boolean awakened
waiting
private boolean waiting
- true if I'm waiting, if this is false then I am running and a notify is not required.
inPause
private boolean inPause
running
private boolean running
stopRequested
private boolean stopRequested
stopped
private boolean stopped
lastServiceTime
private long lastServiceTime
earlyWakeupCount
private int earlyWakeupCount
| Constructor Detail |
BasicDaemon
public BasicDaemon(org.apache.derby.iapi.services.context.ContextService contextService)
- make a BasicDaemon
| Method Detail |
subscribe
public int subscribe(org.apache.derby.iapi.services.daemon.Serviceable newClient, boolean onDemandOnly)
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Add a new client that this daemon needs to service
- Specified by:
subscribein interfaceorg.apache.derby.iapi.services.daemon.DaemonService
unsubscribe
public void unsubscribe(int clientNumber)
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Get rid of a client from the daemon.
- Specified by:
unsubscribein interfaceorg.apache.derby.iapi.services.daemon.DaemonService
serviceNow
public void serviceNow(int clientNumber)
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Service this subscription ASAP. Does not guarantee that the daemon
will actually do anything about it.
- Specified by:
serviceNowin interfaceorg.apache.derby.iapi.services.daemon.DaemonService
enqueue
public boolean enqueue(org.apache.derby.iapi.services.daemon.Serviceable newClient, boolean serviceNow)
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Request a one time service from the Daemon. Unless performWork returns
REQUEUE (see Serviceable), the daemon will service this client once
and then it will get rid of this client. Since no client number is
associated with this client, it cannot request to be serviced or be
unsubscribed.
The work is always added to the deamon, regardless of the
state it returns.
- Specified by:
enqueuein interfaceorg.apache.derby.iapi.services.daemon.DaemonService
clear
public void clear()
- Get rid of all queued up Serviceable tasks.
- Specified by:
clearin interfaceorg.apache.derby.iapi.services.daemon.DaemonService
nextAssignment
protected ServiceRecord nextAssignment(boolean urgent)
serviceClient
protected void serviceClient(ServiceRecord clientRecord)
run
public void run()
- Description copied from interface:
java.lang.Runnable - This method will be called by whoever wishes to run your class
implementing Runnable. Note that there are no restrictions on what
you are allowed to do in the run method, except that you cannot
throw a checked exception.
- Specified by:
runin interfacejava.lang.Runnable
pause
public void pause()
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Pause. No new service is performed until a resume is issued.
- Specified by:
pausein interfaceorg.apache.derby.iapi.services.daemon.DaemonService
resume
public void resume()
- Description copied from interface:
org.apache.derby.iapi.services.daemon.DaemonService - Resume service after a pause
- Specified by:
resumein interfaceorg.apache.derby.iapi.services.daemon.DaemonService
stop
public void stop()
- Finish what we are doing and at the next convenient moment, get rid of
the thread and make the daemon object goes away if possible.
remember we are calling from another thread
- Specified by:
stopin interfaceorg.apache.derby.iapi.services.daemon.DaemonService
waitUntilQueueIsEmpty
public void waitUntilQueueIsEmpty()
- Specified by:
waitUntilQueueIsEmptyin interfaceorg.apache.derby.iapi.services.daemon.DaemonService
stopRequested
private boolean stopRequested()
inPause
private boolean inPause()
wakeUp
protected void wakeUp()
rest
private boolean rest()
- Returns true if awakened by some notification, false if wake up by timer
work
private void work(boolean urgentOnly)
yield
private void yield()
|
|||||||||
| Home >> All >> org >> apache >> derby >> impl >> services >> [ daemon overview ] | PREV CLASS NEXT CLASS | ||||||||
SUMMARY: JAVADOC | SOURCE | DOWNLOAD | NESTED | FIELD | CONSTR | METHOD |
DETAIL: FIELD | CONSTR | METHOD | ||||||||
JAVADOC
org.apache.derby.impl.services.daemon.BasicDaemon