Master/Slave Server

Taramsis

Grünschnabel
Ich habe einen MATLAB-Server der Anfragen über Java an MATLAB übergibt. Da MATLAB immer nur eine Anfrage bearbeiten kann, habe ich eine MASTER/Slave Serverstruktur überlegt.
D.h. der Master bekommt die Anfragen und leitet diese an die Slave Server weiter.

Könnte ich auch hier den "newSingleThreadExecutor()" verwenden?
(siehe auch http://www.tutorials.de/java/379845-fifo-fuer-threads.html)

D.h. wären zwei SlaveServer verfügbar, müßte die Warteschlange ja nicht immer nur ein Thread zulassen , sondern zwei!
 
Ich brauche eigentlich nur eine Warteschlange in denen die Threads pausiert und warten bis sie herausgenommen und aktiviert werden.

Also etwas in der Form:

Klasse Network:
Java:
public static Queue q = new LinkedList();

 public void listen() {
       try {
            serverSkt = new ServerSocket(port);
            alive=true;
            new NetworkSlaveServerStatus(this).startThread();
            
            while(alive){
                Socket skt = serverSkt.accept();
                NetworkThread netThread = new NetworkThread(skt,this);  //hier werden die Anfragen erstellt
                q.add(netThread); 
                
                synchronized(netThread){
                    while(getSlave1Status()|getSlave2Status() == true){
                        q.remove();
                        netThread.proceed(); // geht natürlich nicht soll nur die Idee darstellen
                    }
                }
            }           
        }

        catch (IOException ex) {
        }
    }

Klasse NetworkThread:

Java:
private boolean threadStatus = true;

public void run() {

//....

synchronized (this){
            while(threadStatus) {
                try {
                    wait();
                } catch (InterruptedException ex) {
                    Logger.getLogger(NetworkThread.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        }
}

//....

public void pause() {
      threadStatus = true;
    }
 
    public void proceed() {
      threadStatus = false;
      notify();
    }

Wie kann man jetzt einen bestimmten Thread aus in und aus einer Warteschlange einfügen/entnehmen?
 
Hi,
was mich an dieser Stelle mal interessiert, warum arbeitest du mit Threads, wenn du diese eh nur hintereinander weg laufen lassen willst. Wenn du immer nur 1 Thread am laufen hast und dann wartest bis dieser fertig ist, kannst du das auch ohne Threads realisieren. Oder sehe ich das falsch?

Gruß

Fabio
 
Zuletzt bearbeitet:
warum arbeitest du an mit Threads, wenn du diese eh nur hintereinander weg laufen lassen willst. Wenn du immer nur 1 Thread am laufen hast und dann wartest bis dieser fertig ist, kannst du das auch ohne Threads realisieren. Oder sehe ich das falsch?

Ein Kurzes Beispiel zur Erläuterung:
Der MasterServer bekommt ständig Anfragen von irgendwelchen Clients. Es sollen mindestens zwei Slaveserver verfügbar sein, die diese Anfragen bearbeiten können. Nach der Bearbeitung sollen die Antworten zurück an den Masterserver, der diese an die Clients zurückschickt.
Somit würden sich Threads, denke ich am besten eignen.
 
Dann würde ich das aber von der Master-/SlaveServer-Client-Struktur ein bischen ändern. Wenn ich das bei dir richtig verstehe dann sieht das Design von dir momentan so aus, dass dann immer nur 1 SlaveServer am arbeiten ist.

Warum machst du es nicht so, dass du x-Anzahl von SlaveServern einsetzen kannst/könntest. Ich würde das ungefähr so realisieren:

Der MasterServer bekommt 2 Queues (eine für den Empfang von Requests und eine zum Versand): (Pseudocode)
Code:
Queue anfragen = new Queue();
Queue rückgabe = new Queue();

In diesen Queues speicherst du einmal die Anfragen in einem Objekt mit der jeweiligen Client-Zugehörigkeit. Z.B. so: (Pseudocode)
Code:
class Request {
   Client client;
   Object rückgabeWert;
}
In dem Object rückgabeWert speicherst du den Wert ab, den dir dein Thread (Slaveserver) einträgt. Sobald ein Request-Objekt in der Queue ist, wird ein Slaveserver gestartet, an diesen du das Request-Objekt übergibst - z.B. über den Konstruktor. Wenn der SlaveS. den Request abgearbeitet hat, dann wird er das RequestObject an den MasterServer zurückgeben und in die Rückgabequeue stecken. Diese muss dann natürlich auch vom MasterS. abgearbeitet werden.

Ich hoffe das war soweit verständlich. Falls nicht, dann frag einfach nach. :)

Gruß

Fabio
 
Dann würde ich das aber von der Master-/SlaveServer-Client-Struktur ein bischen ändern. Wenn ich das bei dir richtig verstehe dann sieht das Design von dir momentan so aus, dass dann immer nur 1 SlaveServer am arbeiten ist.

Ja, stimmt. Das ist war für den zweiten Schritt gedacht! Ich wollte es erstmal zum laufen bringen! Ich wollte dann für jeden SlaveServer einen WorkerThread erstellen, der aus der Queue die AnfrageThreads holt. (natürch wäre dies ein kritischer Abschnitt)

Sobald ein Request-Objekt in der Queue ist, wird ein Slaveserver gestartet, an diesen du das Request-Objekt übergibst - z.B. über den Konstruktor.

Das geht leider nicht, da MATLAB eine relativ lange Startphase hat, müssen die SlaveServer bereits gestartet sein, d.h. ich weiß zu jeder Zeit wieviele SlaveServer aktiv sind.

Das wird ein Problem, wenn man deine Idee umsetzen will. (Wenn ich dich richtig verstanden haben!)
 
Ok. Du kannst es ja auch so machen, dass die SlaveServer auf die Anfrage-Queue listen und sobald eine Anfrage vorhanden ist, nimmt derjenige SlaveServer der zu erst war sich diese Anfrage und bearbeitet diese. Dann müsste es auch funktionieren
 
Zurück