public abstract class AsynchronousRequestDelegate extends java.lang.Object implements IRequestDelegate
startRequest(IRequest, IActivationBuffer, double)
and
finishRequest(IRequest, IActivationBuffer, Object)
. This makes it
easier to implement asynchronous requests that start a computation and then
later harvest the results.isAsynchronous()
to return true, and use
computeCompletionTime(double, IRequest, IActivationBuffer)
to return
when the system should call
finishRequest(IRequest, IActivationBuffer, Object)
.finishRequest(IRequest, IActivationBuffer, Object)
requires some
value from startRequest(IRequest, IActivationBuffer, double)
they
both have an object that can be passed from one to the other.startRequest(IRequest, IActivationBuffer, double)
and then queueing
up a ITimedEvent
that will fire at
computeCompletionTime(double, IRequest, IActivationBuffer)
which
will then call finishRequest(IRequest, IActivationBuffer, Object)
. finishRequest(IRequest, IActivationBuffer, Object)
. However, if you
do enable blocking timed events (setUseBlockingTimedEvents(boolean)
), you must be sure that you call release()
in response to some
event, otherwise the model will deadlock.Constructor and Description |
---|
AsynchronousRequestDelegate() |
Modifier and Type | Method and Description |
---|---|
protected void |
abortRequest(IRequest request,
IActivationBuffer buffer,
java.lang.Object startValue)
called if the timedevent is aborted
|
void |
clear()
clear/cancel any pending requests
|
protected double |
computeCompletionTime(double startTime,
IRequest request,
IActivationBuffer buffer)
default impl returns now +
IProceduralModule.getDefaultProductionFiringTime() |
protected ITimedEvent |
createFinishTimedEvent(double start,
double finish,
IRequest request,
IActivationBuffer buffer,
java.lang.Object startValue)
creates the timed event that will fire the finish method.
|
protected IRequest |
expandRequest(IRequest request)
expand requests gives subclassers the chance to modify the request after it
has been validated but before the request is actually made.
|
protected abstract void |
finishRequest(IRequest request,
IActivationBuffer buffer,
java.lang.Object startValue)
finish the request
|
protected ITimedEvent |
getCurrentTimedEvent()
returns the last timed event queued.
|
protected IRequest |
getPreviousRequest() |
boolean |
isAsynchronous()
override to return true if the request should be split in time.
|
protected boolean |
isBusy(IActivationBuffer buffer)
utility method to test the state, only works if this buffer extends
IStatusBuffer |
boolean |
isDelayingStart() |
boolean |
isUsingBlockingTimedEvents() |
protected abstract boolean |
isValid(IRequest request,
IActivationBuffer buffer)
called the be sure the request is valid.
|
protected void |
postStart(IRequest request,
IActivationBuffer buffer,
double startTime,
double finishTime,
java.lang.Object startReturn) |
protected void |
preStart(IRequest request,
IActivationBuffer buffer,
double startTime,
double finishTime)
called just before
startRequest(IRequest, IActivationBuffer, double) is called |
protected void |
release()
release the current blocking timed event, if any
|
boolean |
request(IRequest request,
IActivationBuffer buffer,
double requestTime)
make the buffer request.
|
void |
setAsynchronous(boolean isAsynch) |
protected void |
setBusy(IActivationBuffer buffer)
utility method, only works if buffer extends
AbstractActivationBuffer6 |
protected void |
setCurrentTimedEvent(ITimedEvent event) |
void |
setDelayStart(boolean delayStart) |
protected void |
setError(IActivationBuffer buffer)
utility method, only works if buffer extends
AbstractActivationBuffer6 |
protected void |
setError(IActivationBuffer buffer,
IChunk errorCode) |
protected void |
setFree(IActivationBuffer buffer)
utility method, only works if buffer extends
AbstractActivationBuffer6 |
void |
setUseBlockingTimedEvents(boolean use) |
protected abstract java.lang.Object |
startRequest(IRequest request,
IActivationBuffer buffer,
double requestTime)
Start the buffer request, optimally returning an object for the
finishRequest(IRequest, IActivationBuffer, Object) to inspect. |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
willAccept
protected void release()
public void setUseBlockingTimedEvents(boolean use)
public boolean isUsingBlockingTimedEvents()
public boolean isDelayingStart()
public void setDelayStart(boolean delayStart)
protected abstract boolean isValid(IRequest request, IActivationBuffer buffer) throws java.lang.IllegalArgumentException
request
- buffer
- TODOjava.lang.IllegalArgumentException
protected abstract java.lang.Object startRequest(IRequest request, IActivationBuffer buffer, double requestTime)
finishRequest(IRequest, IActivationBuffer, Object)
to inspect. If
this is an asynchronous request, this will be fired and finish will be
fired at
computeCompletionTime(double, IRequest, IActivationBuffer)
request
- buffer
- requestTime
- TODOprotected abstract void finishRequest(IRequest request, IActivationBuffer buffer, java.lang.Object startValue)
request
- buffer
- startValue
- protected void abortRequest(IRequest request, IActivationBuffer buffer, java.lang.Object startValue)
request
- buffer
- startValue
- public void clear()
IRequestDelegate
clear
in interface IRequestDelegate
public final void setAsynchronous(boolean isAsynch)
public final boolean isAsynchronous()
computeCompletionTime(double, IRequest, IActivationBuffer)
as wellprotected double computeCompletionTime(double startTime, IRequest request, IActivationBuffer buffer)
IProceduralModule.getDefaultProductionFiringTime()
now
- request
- buffer
- TODOprotected IRequest expandRequest(IRequest request)
request
- public final boolean request(IRequest request, IActivationBuffer buffer, double requestTime)
startRequest(IRequest, IActivationBuffer, double)
and
finishRequest(IRequest, IActivationBuffer, Object)
will be called
immediately. If not, start will be called and a timed event will be posted
that will handle
finishRequest(IRequest, IActivationBuffer, Object)
request
in interface IRequestDelegate
request
- buffer
- org.jactr.core.buffer.delegate.IRequestDelegate#request(org.jactr.core.production.request.IRequest,
org.jactr.core.buffer.IActivationBuffer)
protected void preStart(IRequest request, IActivationBuffer buffer, double startTime, double finishTime)
startRequest(IRequest, IActivationBuffer, double)
is calledrequest
- buffer
- startTime
- finishTime
- protected void postStart(IRequest request, IActivationBuffer buffer, double startTime, double finishTime, java.lang.Object startReturn)
protected ITimedEvent createFinishTimedEvent(double start, double finish, IRequest request, IActivationBuffer buffer, java.lang.Object startValue)
start
- finish
- request
- buffer
- startValue
- protected ITimedEvent getCurrentTimedEvent()
protected void setCurrentTimedEvent(ITimedEvent event)
protected IRequest getPreviousRequest()
protected boolean isBusy(IActivationBuffer buffer)
IStatusBuffer
buffer
- protected void setBusy(IActivationBuffer buffer)
AbstractActivationBuffer6
buffer
- protected void setFree(IActivationBuffer buffer)
AbstractActivationBuffer6
buffer
- protected void setError(IActivationBuffer buffer)
AbstractActivationBuffer6
buffer
- protected void setError(IActivationBuffer buffer, IChunk errorCode)