CTX
- The context type to use, can by any Component
, service
or POJO.RET
- The return type of the Undoable
's proceedings.H
- The handle type used to reference a job.public abstract class AbstractJobBus<CTX,H> extends Object implements JobBus<CTX,H>
AbstractJobBus
implements the JobBus
interface.Constructor and Description |
---|
AbstractJobBus(CTX aContext,
org.refcodes.component.HandleGenerator<H> aHandleGenerator)
Instantiates the
AbstractJobBus with the provided context and the
provided HandleGenerator . |
AbstractJobBus(CTX aContext,
org.refcodes.component.HandleGenerator<H> aHandleGenerator,
ExecutorService aExecutorService)
Instantiates the
AbstractJobBus with the provided context and the
provided HandleGenerator . |
Modifier and Type | Method and Description |
---|---|
H |
execute(org.refcodes.command.Undoable<CTX,?,?> aJob)
Executes the given job.
|
<RET,E extends Exception> |
execute(org.refcodes.command.Undoable<CTX,RET,E> aJob,
BiConsumer<RET,E> aResultConsumer)
Executes the given job and invokes the provides
BiConsumer lambda
(closure) upon finished execution. |
<RET,E extends Exception> |
execute(org.refcodes.command.Undoable<CTX,RET,E> aJob,
Consumer<RET> aResultConsumer)
Executes the given job and invokes the provided
Consumer lambda
(closure) upon finished execution. |
void |
flush(H aHandle) |
<E extends Exception> |
getException(H aHandle)
Returns the exception of the job in case it terminated with an error.
|
protected org.refcodes.command.Undoable<CTX,?,?> |
getJob(H aHandle) |
float |
getProgress(H aHandle) |
<RET> RET |
getResult(H aHandle)
Returns the result of the job as the result of executing the job.
|
<JOB extends org.refcodes.command.Undoable<CTX,RET,?>,RET> |
getResult(JOB aJob)
Executes the job and waits for the job's result or an exception.
|
<JOB extends org.refcodes.command.Undoable<CTX,RET,?>,RET> |
getResult(JOB aJob,
long aTimeoutInMs)
Executes the job and waits for the job's result or an exception or till
the timeout has been reached.
|
protected Collection<org.refcodes.command.Undoable<CTX,?,?>> |
handleReferences()
Retrieves the list of objects referenced by the handles.
|
protected Set<H> |
handles()
Returns the set of handles managed by this implementation.
|
boolean |
hasException(H aHandle)
Determines whether the job identified by the given handle ended with an
exception (instead of a regular result).
|
boolean |
hasFlush(H aHandle) |
boolean |
hasHandle(H aHandle) |
boolean |
hasProgress(H aHandle) |
boolean |
hasReset(H aHandle) |
boolean |
hasResult(H aHandle)
Determines whether the job identified by the given handle has a regular
result (instead of an exception).
|
boolean |
isExecuted(H aHandle)
Determines whether the job has been executed.
|
org.refcodes.command.Undoable<CTX,?,?> |
lookupHandle(H aHandle) |
org.refcodes.command.Undoable<CTX,?,?> |
removeHandle(H aHandle) |
void |
reset(H aHandle) |
void |
waitForExecution(H aHandle)
Waits till the job identified by the given handle finished execution by
regularly terminating or by throwing an exception.
|
void |
waitForExecution(H aHandle,
long aTimeoutInMs)
Waits till the job identified by the given handle finished execution by
regularly terminating or by throwing an exception or till the timeout has
been reached.
|
public AbstractJobBus(CTX aContext, org.refcodes.component.HandleGenerator<H> aHandleGenerator)
AbstractJobBus
with the provided context and the
provided HandleGenerator
. It is up to you which context (service,
Component
, POJO) you want to provide to a
job (Undoable
) when being executed.
Also you can provide any HandleGenerator
you thing useful when
creating handles. It is up to your HandleGenerator
to generate
unique handle objects. The JobBusDirectory
actually uses a
String
objects generating HandleGenerator
. Make sure your
handles implement the Object.hashCode()
and Object.equals(Object)
methods as of their method contracts as them handles will be used in
collections such as HashMap
data structures.aContext
- The context which is passed to the job (Undoable
)
instances when being executed.aHandleGenerator
- The HandleGenerator
to be used when
generating unique handle objects.public AbstractJobBus(CTX aContext, org.refcodes.component.HandleGenerator<H> aHandleGenerator, ExecutorService aExecutorService)
AbstractJobBus
with the provided context and the
provided HandleGenerator
. It is up to you which context (service,
Component
, POJO) you want to provide to a
job (Undoable
) when being executed.
Also you can provide any HandleGenerator
you thing useful when
creating handles. It is up to your HandleGenerator
to generate
unique handle objects. The JobBusDirectory
actually uses a
String
objects generating HandleGenerator
. Make sure your
handles implement the Object.hashCode()
and Object.equals(Object)
methods as of their method contracts as them handles will be used in
collections such as HashMap
data structures.aContext
- The context which is passed to the job (Undoable
)
instances when being executed.aHandleGenerator
- The HandleGenerator
to be used when
generating unique handle objects.aExecutorService
- The ExecutorService
to be used, when null
then an ExecutorService
something like
ControlFlowUtility.createDaemonExecutorService()
is then
retrieved.public H execute(org.refcodes.command.Undoable<CTX,?,?> aJob)
JobBus
public <RET,E extends Exception> void execute(org.refcodes.command.Undoable<CTX,RET,E> aJob, BiConsumer<RET,E> aResultConsumer)
JobBus
BiConsumer
lambda
(closure) upon finished execution. The first parameter is passed in case
we have an ordinary result, the second one is passed in case we have an
exceptional situation. Either the one parameter or the other one is
passed, never both of them at the same invocation! In case both arguments
are null, then your job has returned null. Consider using the
Optional
to be returned by your job. Though consider that the
Optional
is NOT serializable which could cause problems with
remote job execution!
In case you do not have to take action upon an exceptional situation,
then use the JobBus.execute(Undoable, Consumer)
method.execute
in interface JobBus<CTX,H>
aJob
- The job to be executed.aResultConsumer
- The BiConsumer
lambda to be invoked upon
finished execution.public <RET,E extends Exception> void execute(org.refcodes.command.Undoable<CTX,RET,E> aJob, Consumer<RET> aResultConsumer)
JobBus
Consumer
lambda
(closure) upon finished execution. The parameter is passed in case we
have an ordinary result, an exceptual situation is "ignored" as the
Consumer
will not be invoked in such a case.
In case you have to take action upon an exceptional situation, then use
the JobBus.execute(Undoable, BiConsumer)
method.public <E extends Exception> E getException(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.command.NotYetExecutedRuntimeException, org.refcodes.command.NoExceptionAvailableRuntimeException
JobBus
getException
in interface JobBus<CTX,H>
aHandle
- The handle associated to the job in question.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.org.refcodes.command.NotYetExecutedRuntimeException
- in case the job has not been
executed yet.org.refcodes.command.NoExceptionAvailableRuntimeException
- in case the job did not
provide an exception after execution.public <RET> RET getResult(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.command.NotYetExecutedRuntimeException, org.refcodes.command.NoResultAvailableRuntimeException
JobBus
getResult
in interface JobBus<CTX,H>
RET
- As of convenience, the return type of the Undoable
instance's proceedings. CAUTION: As the handle does not permit
insight on the Undoable
(job) instance's return type, you
may end up with a class cast exception in case you do not make
sure that the result is of the expected type aHandle
- The handle associated to the job in question.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.org.refcodes.command.NotYetExecutedRuntimeException
- in case the job has not been
executed yet.org.refcodes.command.NoResultAvailableRuntimeException
- in case the job did not provide
a result after execution.public boolean hasException(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.command.NotYetExecutedRuntimeException
JobBus
hasException
in interface JobBus<CTX,H>
aHandle
- The handle associated to the job in question.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.org.refcodes.command.NotYetExecutedRuntimeException
- in case the job has not been
executed yet.public boolean hasResult(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.command.NotYetExecutedRuntimeException
JobBus
hasResult
in interface JobBus<CTX,H>
aHandle
- The handle associated to the job in question.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.org.refcodes.command.NotYetExecutedRuntimeException
- in case the job has not been
executed yetpublic boolean isExecuted(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
JobBus
isExecuted
in interface JobBus<CTX,H>
aHandle
- The handle associated to the job in question.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.public void waitForExecution(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
JobBus
waitForExecution
in interface JobBus<CTX,H>
aHandle
- The handle associated with the provided job.org.refcodes.component.UnknownHandleRuntimeException
- in case the handle is not unknown.public void waitForExecution(H aHandle, long aTimeoutInMs) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.component.HandleTimeoutRuntimeException
JobBus
HandleTimeoutRuntimeException
is thrown to abort the waiting
loop. This is especially useful when a remote connection is used to
managed a distributed JobBus
infrastructure and due to connection
issues, wait time would be endless.
The handle my be used to determine if there was an exception or not and
to retrieve the result or in case of an exception the exception object.waitForExecution
in interface JobBus<CTX,H>
aHandle
- The handle associated with the provided job.aTimeoutInMs
- The timeout to wait at most even when execution did
not finish. In case the timeout has been reached before execution
was finished, then a HandleTimeoutRuntimeException
is
thrown to abort the waiting loop.org.refcodes.component.UnknownHandleRuntimeException
- Thrown in case the handle is not
unknown.org.refcodes.component.HandleTimeoutRuntimeException
- Thrown in case the timeout was
reached before execution finished.public <JOB extends org.refcodes.command.Undoable<CTX,RET,?>,RET> RET getResult(JOB aJob) throws org.refcodes.command.NoResultAvailableRuntimeException
JobBus
getResult
in interface JobBus<CTX,H>
RET
- The return type of the Undoable
's proceedings.aJob
- The job to executeorg.refcodes.command.NoResultAvailableRuntimeException
- in case a job has been executed
which never delivers a result or which terminated with an
exception. Use JobBus.hasException(Object)
and
JobBus.hasResult(Object)
to clarify which state your
Undoable
(job) is in.public <JOB extends org.refcodes.command.Undoable<CTX,RET,?>,RET> RET getResult(JOB aJob, long aTimeoutInMs) throws org.refcodes.command.NoResultAvailableRuntimeException, org.refcodes.component.HandleTimeoutRuntimeException
JobBus
HandleTimeoutRuntimeException
is thrown to abort the waiting
loop. This is especially useful when a remote connection is used to
managed a distributed JobBus
infrastructure and due to connection
issues, wait time would be endless.getResult
in interface JobBus<CTX,H>
RET
- The return type of the Undoable
's proceedings.aJob
- The job to executeaTimeoutInMs
- The timeout to wait at most even when execution did
not finish. In case the timeout has been reached before execution
was finished, then a HandleTimeoutRuntimeException
is
thrown to abort the waiting loop.org.refcodes.command.NoResultAvailableRuntimeException
- in case a job has been executed
which never delivers a result or which terminated with an
exception. Use JobBus.hasException(Object)
and
JobBus.hasResult(Object)
to clarify which state your
Undoable
(job) is in.org.refcodes.component.HandleTimeoutRuntimeException
public boolean hasHandle(H aHandle)
public org.refcodes.command.Undoable<CTX,?,?> lookupHandle(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
public org.refcodes.command.Undoable<CTX,?,?> removeHandle(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
public boolean hasProgress(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
hasProgress
in interface org.refcodes.component.ProgressHandle<H>
org.refcodes.component.UnknownHandleRuntimeException
public float getProgress(H aHandle) throws org.refcodes.component.UnsupportedHandleOperationRuntimeException, org.refcodes.component.UnknownHandleRuntimeException
getProgress
in interface org.refcodes.component.ProgressHandle<H>
org.refcodes.component.UnsupportedHandleOperationRuntimeException
org.refcodes.component.UnknownHandleRuntimeException
public boolean hasReset(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
hasReset
in interface org.refcodes.component.ResetHandle<H>
org.refcodes.component.UnknownHandleRuntimeException
public void reset(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.component.UnsupportedHandleOperationRuntimeException
reset
in interface org.refcodes.component.ResetHandle<H>
org.refcodes.component.UnknownHandleRuntimeException
org.refcodes.component.UnsupportedHandleOperationRuntimeException
public boolean hasFlush(H aHandle) throws org.refcodes.component.UnknownHandleRuntimeException
hasFlush
in interface org.refcodes.component.FlushHandle<H>
org.refcodes.component.UnknownHandleRuntimeException
public void flush(H aHandle) throws IOException, org.refcodes.component.UnknownHandleRuntimeException, org.refcodes.component.UnsupportedHandleOperationRuntimeException
flush
in interface org.refcodes.component.FlushHandle<H>
IOException
org.refcodes.component.UnknownHandleRuntimeException
org.refcodes.component.UnsupportedHandleOperationRuntimeException
protected Collection<org.refcodes.command.Undoable<CTX,?,?>> handleReferences()
protected Set<H> handles()
Copyright © 2016. All rights reserved.