T
tuxedo
Gast
Hallo zusammen,
hab mal eine kleine Designfrage:
Ich hab eine Klasse (die als Thread realisiert ist) die eingehende Anfragen vom Socket liest und "beantwortet". Das geschieht in der "Endlosschleife" des Threads. Parallel dazu habe ich 2 Methoden die selbst Anfragen an den "Gegenüber" senden und eine Antwort erwarten. Das ganze passt jetzt nicht so einfach zusammen weil ich ja a) in der Endlosschleife vom Socket lese und b) in einer der beiden Methoden sende und danach ebenfalls lese.
Ich versuch mal die aktuelle Situation zu skizzieren:
Man sieht schnell dass da was in die Hose geht. Ich kann ja nicht an zwei Stellen vom Stream lesen ohne dass ich Konsistentprobleme bekomme. Das ganze muss nun irgendwie asynchron laufen:
Empfangen geschieht ausschließlich an der einen Stelle (Schleife), senden an einer anderen (weitere Methoden).
Mein erster Ansatz wäre jetzt folgender (am Beispiel "sendMethodA()"):
Ich lass mich eine eindeutige ID für meine Anfragen generieren, sende meine Anfrage und warte dann, bis mir der PacketHandler (der, der ion der endlosschleife in der run() Methode läuft) die passende Antwort dazu in einer HashMap (oder sonstwas) zur Verfügung stellen kann. Dann nehme ich die Antwort und liefere sie als return-Wert. Das ganze ließe sich natürlich noch mit einem TimeOut belegen.
Prinzipiell müsste das funktionieren. Doch mich stört daran, dass ich ein Sleep() einbauen muss. Zudem weiß ich nicht wie effizient es ist eine HashMap auf diesem Wege nach dem "vorhandensein" der passenden Antwort zu fragen.
Am geschicktesten wäre es, wenn sich die Methode nach dem senden schlafen legen würde, und erst dann - getriggert vom PacketHandler - weiter macht wenn die Antwort da ist.
Hat da jemand nen Tipp für mich? Sollte halt möglichst effizient sein.
- Alex
hab mal eine kleine Designfrage:
Ich hab eine Klasse (die als Thread realisiert ist) die eingehende Anfragen vom Socket liest und "beantwortet". Das geschieht in der "Endlosschleife" des Threads. Parallel dazu habe ich 2 Methoden die selbst Anfragen an den "Gegenüber" senden und eine Antwort erwarten. Das ganze passt jetzt nicht so einfach zusammen weil ich ja a) in der Endlosschleife vom Socket lese und b) in einer der beiden Methoden sende und danach ebenfalls lese.
Ich versuch mal die aktuelle Situation zu skizzieren:
Code:
class SocketThread extends Thread {
public void run() {
while (!interrupted()){
packetHandler.process(objectInputStream.readObject());
}
}
public Object sendMethodA(Object someDataA){
objectOutputStream.writeObject(someData);
return objectInputStream.readObject();
}
public Object sendMethodB(Object someDataB1, Object someDataB2){
objectOutputStream.writeObject(someDataB1);
objectOutputStream.writeObject(someDataB2);
return objectInputStream.readObject();
}
Man sieht schnell dass da was in die Hose geht. Ich kann ja nicht an zwei Stellen vom Stream lesen ohne dass ich Konsistentprobleme bekomme. Das ganze muss nun irgendwie asynchron laufen:
Empfangen geschieht ausschließlich an der einen Stelle (Schleife), senden an einer anderen (weitere Methoden).
Mein erster Ansatz wäre jetzt folgender (am Beispiel "sendMethodA()"):
Code:
public Object sendMethodA(Object someDataA){
int anfrageId = this.generateAnfrageId();
objectOutputStream.writeObject(someData);
while (!receivedAnswers.containsKey(anfrageId){
Thread.sleep(1);
}
return receivedAnswers.get(anfrageId);
}
Ich lass mich eine eindeutige ID für meine Anfragen generieren, sende meine Anfrage und warte dann, bis mir der PacketHandler (der, der ion der endlosschleife in der run() Methode läuft) die passende Antwort dazu in einer HashMap (oder sonstwas) zur Verfügung stellen kann. Dann nehme ich die Antwort und liefere sie als return-Wert. Das ganze ließe sich natürlich noch mit einem TimeOut belegen.
Prinzipiell müsste das funktionieren. Doch mich stört daran, dass ich ein Sleep() einbauen muss. Zudem weiß ich nicht wie effizient es ist eine HashMap auf diesem Wege nach dem "vorhandensein" der passenden Antwort zu fragen.
Am geschicktesten wäre es, wenn sich die Methode nach dem senden schlafen legen würde, und erst dann - getriggert vom PacketHandler - weiter macht wenn die Antwort da ist.
Hat da jemand nen Tipp für mich? Sollte halt möglichst effizient sein.
- Alex