Interface Pipeline
- All Known Implementing Classes:
DefaultPipeline
,DrasylPipeline
,EmbeddedPipeline
Handler
s which handles or intercepts inbound events and outbound operations of
a DrasylNode
. Pipeline
implements an advanced form of the
Intercepting
Filter pattern to give a user full control over how an event is handled and how the Handler
s in a pipeline interact with each other. This implementation is very closely based on
the netty implementation.
Creation of a pipeline
Each per DrasylNode exists one pipeline and it is created automatically when a new node is created.
How an event flows in a pipeline
The following diagram describes how I/O events are processed by Handler
s in a Pipeline
typically. An I/O event are handled by a Handler
and be forwarded to its
closest handler by calling the event propagation methods defined in HandlerContext
, such
as HandlerContext.fireRead(Address, Object, CompletableFuture)
and HandlerContext.write(Address, Object, CompletableFuture)
.
I/O Request
via HandlerContext
|
+---------------------------------------------------+---------------+
| Pipeline | |
| \|/ |
| +---------------------+ +-----------+----------+ |
| | Handler N | | Handler 1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Handler N-1 | | Handler 2 | |
| +----------+----------+ +-----------+----------+ |
| /|\ . |
| . . |
| HandlerContext.fireIN_EVT() HandlerContext.OUT_EVT() |
| [method call] [method call] |
| . . |
| . \|/ |
| +----------+----------+ +-----------+----------+ |
| | Handler 2 | | Handler M-1 | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
| | \|/ |
| +----------+----------+ +-----------+----------+ |
| | Handler 1 | | Handler M | |
| +----------+----------+ +-----------+----------+ |
| /|\ | |
+---------------+-----------------------------------+---------------+
| \|/
+---------------+-----------------------------------+---------------+
| | | |
| [ DrasylNodeComponent ] [ MessageSink.send() ] |
| |
| drasyl internal I/O |
+-------------------------------------------------------------------+
An inbound event is handled by the handlers in the bottom-up direction as shown on the left side of the diagram. A handler usually handles the inbound data generated by the I/O thread on the bottom of the diagram. The inbound data is often read from a remote peer via the actual input operation. If an inbound event goes beyond the top handler, it is passed to the application.
An outbound event is handled by the handler in the top-down direction as shown on the right side of the diagram. A handler usually generates or transforms the outbound traffic such as write requests.
For example, let us assume that we created the following pipeline:
Pipeline
p = ...;
p.addLast("1", new HandlerA());
p.addLast("2", new HandlerB());
p.addLast("3", new HandlerC());
p.addLast("4", new HandlerD());
p.addLast("5", new HandlerE());
In the given example configuration, the handler evaluation order is 1, 2, 3, 4, 5 when an event
goes inbound. When an event goes outbound, the order is 5, 4, 3, 2, 1.
Forwarding an event to the next handler
As you might noticed in the diagram, a handler has to invoke the event propagation methods in
HandlerContext
to forward an event to its next handler. Those methods include:
- Inbound event propagation methods:
- Outbound event propagation methods:
Thread safety
A Handler
can be added or removed at any time because a Pipeline
is thread safe.
DrasylScheduler
, therefore the order of
invocations can't be guaranteed. You have to ensure by yourself, that your handlers are thread-safe
if you need it. Also, you have to ensure the order of messages, if you need it.-
Method Summary
Modifier and TypeMethodDescriptionInserts aHandler
after an existing handler of this pipeline.Inserts aHandler
before an existing handler of this pipeline.Inserts aHandler
at the first position of this pipeline.Appends aHandler
at the last position of this pipeline.Returns the context object of theHandler
with the specified name in this pipeline.Returns theHandler
with the specified name in this pipeline.processInbound
(Event event) Processes an inbound event by the pipeline.processInbound
(Message msg) Processes an inbound message by the pipeline.processInbound
(Address sender, Object msg) Processes an inbound message by the pipeline.processOutbound
(Address recipient, Object msg) Processes an outbound message by the pipeline.Removes theHandler
with the specified name from this pipeline.Replaces theHandler
of the specified name with a new handler in this pipeline.
-
Method Details
-
addFirst
Inserts aHandler
at the first position of this pipeline.- Parameters:
name
- the name of the handler to insert firsthandler
- the handler to insert first- Throws:
IllegalArgumentException
- if there's an entry with the same name already in the pipelineNullPointerException
- if the specified handler isnull
-
addLast
Appends aHandler
at the last position of this pipeline.- Parameters:
name
- the name of the handler to appendhandler
- the handler to append- Throws:
IllegalArgumentException
- if there's an entry with the same name already in the pipelineNullPointerException
- if the specified handler isnull
-
addBefore
Inserts aHandler
before an existing handler of this pipeline.- Parameters:
baseName
- the name of the existing handlername
- the name of the handler to insert beforehandler
- the handler to insert before- Throws:
NoSuchElementException
- if there's no such entry with the specifiedbaseName
IllegalArgumentException
- if there's an entry with the same name already in the pipelineNullPointerException
- if the specified baseName or handler isnull
-
addAfter
Inserts aHandler
after an existing handler of this pipeline.- Parameters:
baseName
- the name of the existing handlername
- the name of the handler to insert afterhandler
- the handler to insert after- Throws:
NoSuchElementException
- if there's no such entry with the specifiedbaseName
IllegalArgumentException
- if there's an entry with the same name already in the pipelineNullPointerException
- if the specified baseName or handler isnull
-
remove
Removes theHandler
with the specified name from this pipeline.- Parameters:
name
- the name under which theHandler
was stored.- Throws:
NoSuchElementException
- if there's no such handler with the specified name in this pipelineNullPointerException
- if the specified name isnull
-
replace
Replaces theHandler
of the specified name with a new handler in this pipeline.- Parameters:
oldName
- the name of theHandler
to be replacednewName
- the name under which the replacement should be addednewHandler
- theHandler
which is used as replacement- Throws:
NoSuchElementException
- if the handler with the specified old name does not exist in this pipelineIllegalArgumentException
- if a handler with the specified new name already exists in this pipeline, except for the handler to be replacedNullPointerException
- if the specified old handler or new handler isnull
-
get
Returns theHandler
with the specified name in this pipeline.- Returns:
- the handler with the specified name.
null
if there's no such handler in this pipeline.
-
context
Returns the context object of theHandler
with the specified name in this pipeline.- Returns:
- the context object of the handler with the specified name.
null
if there's no such handler in this pipeline.
-
processInbound
Processes an inbound message by the pipeline.- Parameters:
sender
- the sender of the messagemsg
- the inbound message
-
processInbound
Processes an inbound message by the pipeline.- Parameters:
msg
- the inbound message
-
processInbound
Processes an inbound event by the pipeline.- Parameters:
event
- the inbound event
-
processOutbound
Processes an outbound message by the pipeline.- Parameters:
recipient
- the recipient of the messagemsg
- the outbound message- Returns:
- a completed future if the message was successfully processed, otherwise an exceptionally future
-