public abstract class ConcurrentServerRunner<T extends Client> extends ContextAwareBase implements java.lang.Runnable, ServerRunner<T>
ServerRunner
.
An instance of this object is created with a ServerListener
and
an Executor
. On invocation of the #start()
method, it
passes itself to the given Executor
and returns immediately. On
invocation of its run()
method by the Executor
it begins
accepting client connections via its ServerListener
. As each
new Client
is accepted, the client is configured with the
runner's LoggingContext
and is then passed to the Executor
for concurrent execution of the client's service loop.
On invocation of the stop()
method, the runner closes the listener
and each of the connected clients (by invoking Client.close()
effectively interrupting any blocked I/O calls and causing these concurrent
subtasks to exit gracefully). This ensures that before the stop()
method returns (1) all I/O resources have been released and (2) all
of the threads of the Executor
are idle.
Constructor and Description |
---|
ConcurrentServerRunner(ServerListener<T> listener,
java.util.concurrent.Executor executor)
Constructs a new server runner.
|
Modifier and Type | Method and Description |
---|---|
void |
accept(ClientVisitor<T> visitor)
Presents each connected client to the given visitor.
|
boolean |
isRunning()
Gets a flag indicating whether the server is currently running.
|
void |
run() |
void |
stop()
Stops execution of the runner.
|
addError, addError, addInfo, addInfo, addStatus, addWarn, addWarn, getContext, getStatusManager, setContext
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
addError, addError, addInfo, addInfo, addStatus, addWarn, addWarn, getContext, setContext
public ConcurrentServerRunner(ServerListener<T> listener, java.util.concurrent.Executor executor)
listener
- the listener from which the server will accept new
clientsexecutor
- a executor that will facilitate execution of the
listening and client-handling tasks; while any Executor
is allowed here, outside of unit testing the only reasonable choice
is a bounded thread pool of some kind.public boolean isRunning()
isRunning
in interface ServerRunner<T extends Client>
public void stop() throws java.io.IOException
This method must cause all I/O and thread resources associated with the runner to be released. If the receiver has not been started, this method must have no effect.
stop
in interface ServerRunner<T extends Client>
java.io.IOException
public void accept(ClientVisitor<T> visitor)
accept
in interface ServerRunner<T extends Client>
visitor
- the subject visitorpublic void run()
run
in interface java.lang.Runnable
Copyright © 2010 - 2020 Adobe. All Rights Reserved