Class MessageAsync<M extends Message>
- Type Parameters:
M
- the type of the messages
- All Implemented Interfaces:
MessageReceiver<M>
,AutoCloseable
SingleSender
which lets the drain's receive method
run asynchronouously in a separate thread.
All received messages are stored internally in a buffer,
and the MessageReceiver.receive(Message)
method of the currently set
SingleSender.drain
is executed in a loop in an own, specially constructed
Thread
, consuming all these messages asynchronouously.
The caller of the here defined receive(Message)
thus returns
immediately, after writing the message into a buffer object.
(This is currently a LinkedBlockingQueue
.)
Once an instance of this class has been closed, sending to it is no longer possible.
-
Field Summary
FieldsModifier and TypeFieldDescription(package private) boolean
Flag which reflects the state of the thread.(package private) final LinkedBlockingQueue
<M> Buffer for the written messages, waiting to be delivered asynchronouously to the drain.(package private) boolean
Flag which reflects the state of the thread.(package private) final Thread
Thread which reads the bufferqueue
and sends it contents asynchronouously to the drainSingleSender.drain
.Fields inherited from class eu.bandm.tools.message.SingleSender
drain
-
Constructor Summary
ConstructorsConstructorDescriptionAfter calling this constructor, a call toSingleSender.setDrain(MessageReceiver)
is necessary beforeSingleSender.send(Message)
can be used.MessageAsync
(MessageReceiver<? super M> r) Constructor which sets the drain. -
Method Summary
Methods inherited from class eu.bandm.tools.message.SingleSender
getDrain, getReceiver, send, setDrain, setReceiver
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface eu.bandm.tools.message.MessageReceiver
ifSubcriticalThen, ifSubcriticalThen, ifSubcriticalThenElse
-
Field Details
-
queue
Buffer for the written messages, waiting to be delivered asynchronouously to the drain. -
interrupted
boolean interruptedFlag which reflects the state of the thread. -
running
boolean runningFlag which reflects the state of the thread. -
thread
Thread which reads the bufferqueue
and sends it contents asynchronouously to the drainSingleSender.drain
.
-
-
Constructor Details
-
MessageAsync
public MessageAsync()After calling this constructor, a call toSingleSender.setDrain(MessageReceiver)
is necessary beforeSingleSender.send(Message)
can be used. Otherwise code will crash intentionally. Cf the documentation ofthe super constructor
. -
MessageAsync
Constructor which sets the drain.- Parameters:
r
- the drain.
-
-
Method Details
-
close
public void close()Interrupt the consuming thread to process all remaining messages, and forbid further receives by this instance.- Specified by:
close
in interfaceAutoCloseable
-
receive
Returns immediately after storing the message to the internal buffer.Will block whenever this buffer is full. Normally this should never happen, since the consumer thread should not starve under normal scheduling discipline.
Overrun is probably caused by kamikaze behaviour of the producer(s), since the buffer has a capacity of
Integer.MAX_VALUE
messages.- Specified by:
receive
in interfaceMessageReceiver<M extends Message>
- Overrides:
receive
in classMessagePasser<M extends Message>
- Parameters:
m
- the message to propagate- Throws:
IllegalStateException
- when this instance has beenclosed before
.
-