Class StreamMultiplexer
- java.lang.Object
-
- de.bsvrz.sys.funclib.communicationStreams.StreamMultiplexer
-
public class StreamMultiplexer extends java.lang.Object
Diese Klasse verschickt Nutzdatenpakete mit Streams an einen StreamDemultiplexer. Die Applikation, die ein Objekt dieser Klasse erzeugt hat, stellt ihrerseits Nutzdaten für jeden Stream zur Verfügung. Auf der Gegenseite kann der StreamDemultiplexer Nutzdaten auf jedem Stream anfordern und verarbeiten. Der StreamMultiplexer sendet seinerseits nur dann Nutzdatenpakete, wenn ihn der StreamDemultiplexer dazu auffordert. Die Nutzdaten werden auch erst dann erzeugt, wenn diese verschickt werden sollen. Der StreamMultiplexer verschickt die Nutzdatenpakete nicht einzeln, sondern bündelt diese in einem großen Paket. Diese großen Pakete werden dann vom StreamDemultiplexer entgegen genommen und ausgepackt. Diese Bündelung findet für jeden Stream einzeln statt, in jedem großen Paket befinden sich also nur Nutzdaten für diesen einen Stream, nicht die Nutzdaten anderer Streams.
-
-
Constructor Summary
Constructors Constructor Description StreamMultiplexer(int numberOfStreams, int blockingFactor, int bufferSizeStreamMultiplexer, int serializerVersion, StreamMultiplexerDirector director)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
killAllStreams()
Alle Streams werden beendet, da die Verbindung zum Empfänger unterbrochen wurde.void
sendAllStreamData()
Diese Methode verschickt Nutzdaten, die die Senderapplikation erzeugt hat, an den Empfänger (StreamDemultiplexer).void
setMaximumStreamTicketIndexForStream(byte[] streamTicketPacket)
Diese Methode setzt den "maximumStreamTicketIndex" eines Streams herauf.
-
-
-
Constructor Detail
-
StreamMultiplexer
public StreamMultiplexer(int numberOfStreams, int blockingFactor, int bufferSizeStreamMultiplexer, int serializerVersion, StreamMultiplexerDirector director)
- Parameters:
numberOfStreams
- Anzahl von Streams, die Datenpakete versenden sollenblockingFactor
- Anzahl der Pakete, die initial am Anfang versendet werdenbufferSizeStreamMultiplexer
- Diese Variable bestimmt die gesamte Größe des Puffers, der zum StreamMultiplexer gehörtserializerVersion
- Diese Variable legt die Versionsnummer des Deserializer/Serializer fest, der benutzt wird. Sowohl der StreamMultiplexer als auch der StreamDemultiplexer müssen die selbe Version benutzendirector
- Schnittstelle, die eine Methode zum verschicken von Informationen an den Sender bereitstellt (siehe Interface Beschreibung)- See Also:
Serializer
,Deserializer
-
-
Method Detail
-
sendAllStreamData
public void sendAllStreamData() throws java.lang.InterruptedException
Diese Methode verschickt Nutzdaten, die die Senderapplikation erzeugt hat, an den Empfänger (StreamDemultiplexer). Ein Problem das sich dabei ergibt ist, welcher Stream ist gerade sendebereit ? Das durchsuchen aller Streams nach einem sendebereiten Stream kann dabei sehr ungeschickt sein, da im "worst Case" immer alle Streams betrachtet werden müßten und das für jede Nachricht. Da jeder Stream mindestens eine Nachricht verschickt wäre somit eine quadratische Laufzeit erreicht.Die Grundidee ist, dass alle Tickets an einer zentralen Stelle gesammelt werden. Dafür wurde als Datenstruktur eine Warteschlange gewählt. Diese synchronisiert sich selbständig und schickt wartende Threads automatisch in den wait Modus, gleichzeitig werden diese Threads wieder aufgeweckt, wenn neue Daten zur Verfügung stehen.
Sobald der Empfänger dem Sender eine Sendeerlaubnis erteilt wird der Stream mit seinem Index und der Anzahl Pakete, die er senden darf, in die Warteschlange eingetragen.
Wenn nun ein Stream gesucht wird, der senden soll, dann wird von der Warteschlange das vorderste Element angefordert. Es steht somit sofort ein Stream zur Verfügung. Gleichzeitig ist bekannt, wieviele Pakete dieser Stream verschicken darf.
- Throws:
java.lang.InterruptedException
- Ein Thread, der auf ein Objekt in der Warteschlange gewartet hat, wurde mit Interrupt unterbrochen.
-
setMaximumStreamTicketIndexForStream
public void setMaximumStreamTicketIndexForStream(byte[] streamTicketPacket) throws java.io.IOException
Diese Methode setzt den "maximumStreamTicketIndex" eines Streams herauf. Dadurch kann der Stream Datenpakete bis zu diesem neuen Index versenden. Wird der "maximumStreamTicketIndex" erreicht, stellt der Stream seine Sendetätigkeiten ein, bis der "maximumStreamTicketIndex" wieder erhöht wird. Verschickt der Empfänger eine "-1", dann will er die Empfangstätigkeiten auf diesem Stream einstellen.
Die ersten 4 Byte enthalten den Index des Streams. Die letzen vier Bytes enthalten den neuen maximalen Index. Dies ist eine Steuerung des einen Multis(Sender) durch den anderen(Receiver), kein Zugriff von außen.
- Parameters:
streamTicketPacket
- Dieses Byte-Array enthält verschlüsselt den Index des Streams und den maximalen Index, bis zu dem der StreamMultiplexer senden darf.- Throws:
java.io.IOException
- Ein Fehler beim deserialisieren von Daten
-
killAllStreams
public void killAllStreams()
Alle Streams werden beendet, da die Verbindung zum Empfänger unterbrochen wurde.Wenn das Objekt, dem der StreamMultiplexer gehört, einen Fehler des DaV gemeldet bekommt (die Leitung zur Empfängerapplikation wurde unterbrochen, als Beispiel) wird mit dieser Methode jeder Stream abgebrochen. Gleichzeitig wird die Sendeapplikation darauf hingewiesen, dass sie alle Nutzdaten für die Streams verwerfen kann. Auf der Gegenseite wird dem StreamDemultiplexer ebenfalls gemeldet, dass etwas mit der Verbindung nicht stimmt (dies übernimmt dort das Objekt, das den StreamDemultiplexer erzeugt hat). Der StreamDemultiplexer wird daraufhin ebenfalls alle Streams beenden. Der beidseitige Abbruch geschieht automatisch.
-
-