Class 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

      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.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Constructor Detail

      • StreamMultiplexer

        public StreamMultiplexer​(int numberOfStreams,
                                 int blockingFactor,
                                 int bufferSizeStreamMultiplexer,
                                 int serializerVersion,
                                 StreamMultiplexerDirector director)
        Parameters:
        numberOfStreams - Anzahl von Streams, die Datenpakete versenden sollen
        blockingFactor - Anzahl der Pakete, die initial am Anfang versendet werden
        bufferSizeStreamMultiplexer - Diese Variable bestimmt die gesamte Größe des Puffers, der zum StreamMultiplexer gehört
        serializerVersion - Diese Variable legt die Versionsnummer des Deserializer/Serializer fest, der benutzt wird. Sowohl der StreamMultiplexer als auch der StreamDemultiplexer müssen die selbe Version benutzen
        director - 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.