Threading

Added by Heslacher about 1 year ago

Hallo,

da ich mich bisher nur am Rande mit Threading beschäftigt habe, komme ich einfach nicht darauf, wie ich den Datenupload von einem/mehreren Clients zum Server auf der Server Seite in separate Threads packen muss. Kann mir vieleicht jemand ein kleines Beispiel geben ?

Beispielcode meines Servers findet ihr hier: http://dev.root1.de/boards/7/topics/259

Danke Hannes


Replies (2)

RE: Threading - Added by achristian about 1 year ago

Hallo Hannes,

Um die Threads musst du dir keine Gedanken machen. Das übernimmt der Simon-Threadpool für dich.

Hier nochmal dein Beispiel aus dem anderen Thread:

 1import de.root1.simon.Simon;
 2import de.root1.simon.annotation.SimonRemote;
 3
 4@SimonRemote(value = {IServer.class})
 5public class ServerImpl implements IServer{
 6
 7    public int getChannelToken() {
 8        MemoryReceiver mr = new MemoryReceiver();
 9        int token = Simon.prepareRawChannel(
10                mr, this);
11        return token;
12    }
13}

Wenn ein Datenpaket beim Server eingeht, dann wir hierfür ein eigener Thread für die bearbeitung beauftragt. Dieser Thread stammt aus dem Simon Threadpool, welchen man über die Simon-Klasse konfigurieren kann.

Der Thread schaut sich das Datenpaket an und entscheidet was zu tun ist. Handelt es sich um ein RawData Paket, so wird rein geschaut zu welchem Token dieses Datenaket gehört. Da du ja auf Serverseite den RawChannel vorbereitet hast (Simon.prepareRawChannel(...)), weiß Simon welches Objekt welcher Klasse für die entgegennahme der Daten zuständig ist. In diesem Fall ist es die jeweilige Instanz von MemoryReceiver.

Natürlich kannst du, je nach Anwendungsgebiet in MemoryReceiver weitere Threads haben die die Daten verarbeiten. Aber müssen tust du's nicht.

Beispiel:

Die Clients machen keinen Dateiuplad, sondern senden dem Server über den RawChannel viele Daten die der Server auswerten muss. Dann könntest du das so machen, dass der Client ein Roh-Datenpaket dem Server schickt. Dieser leitet das Paket weiter in den entsprechenden Receiver. Und hier könntest du einen ganzen Pool von Threads damit beauftragen dieses eine Datenpaket zu zerpfücken und zu bearbeiten.

Im Falle eines Dateiuploads macht das aber keinen Sinn. Wichtig ist, dass die Daten schnell und effizient vom Netzwerk gelesen werden. Das macht pro Datenpaket ein Thread aus dem Simon-Threadpool. Und dieser Thread ruft die entsprechenden Methoden in deiner Receiver-Klasse auf, wo du idealerweise die Daten gleich auf die Platte/Datenbank/sonstwohin schreibst.

Wenn du also viele Clients hast die alle gleichzeitig Daten zum Server schicken, dann regelt Simon die Sache mit den vielen Threads die die Daten erstmal entgegen nehmen und dann entsprechend weiterreichen.

Was du nicht tun solltest: Mit mehreren Threads gleichzeitig EINEN RawChannel mit Daten befeuern. Bin mir aktuell nicht 100%ig sicher ob der Server dann noch die richtige Reihenfolge der Pakete erhält. Ergo: Auf Sender-Seite: Nur einen Thread zum senden auf EINEM RawChannel. Auf Empfängerseite: Das Threading regelt Simon.

- Alex

RE: Threading - Added by Heslacher about 1 year ago

Hi Alex,

super, vielen Dank.

(1-2/2)