2009-05-20 1 views
0

Wie würden Sie das gleiche Warten auf einen vollständigen Methodenaufruf in Java implementieren?Implementierung eines synchronen Netzwerkaufrufs in Java, der auf eine Bestätigungsnachricht wartet?

Im Grunde, was ich tun möchte, ist eine Methode, die eine Nachricht über das Netzwerk an eine Server-Anwendung sendet und wartet, bis es die entsprechende Ack-Nachricht vom Server entweder mit einer Operation erfolgreich oder Operation fehlgeschlagen und eine Fehlermeldung erhalten .

Ich habe bereits eine nicht blockierende Version meiner Methode, die in dem eine Callback-Klasse übergibt hat eine Methode, die auf Rückruf aufgerufen wird.

würde es Sinn machen, eine Callback-Klasse es passiert in meinem vorherigen Verfahren zu konstruieren und dann eine Warteoperation durchführen und auf dem Rückruf diese Klasse haben Sie eine mitteilen?

Antwort

1

Kurze Antwort: Ja. Ich bin ein Fan davon, was in der Klassenbibliothek bereits verwendet wird, was du beschreibst klingt sehr nach einem Observer-Muster, für das du bereits die Observer/Observable-Schnittstellen hast, vorausgesetzt, du benutzt J2SE.

EDIT: Etwas war falsch mit meinem Kaffee :) Offensichtlich, was ich sagen wollte, war, was ist in java.util.concurrent Paket, insbesondere die Zukunft <> und ExecutorService-Klassen.

2

Hinzufügen eines .wait(), um Ihre Callback-Klasse wäre der einfachste Weg sein. Es kann dort sitzen und sich auf einer Flagge drehen, bis Ihr Callback es umschaltet, stellen Sie sicher, dass Sie Thread.yield() oder .sleep() in Ihre Schleife einfügen.

erspart eine alternative Blockierungs Comms Kanal neu zu schreiben.

+0

Warum würden Sie eine Flagge drehen, wenn Sie eine Wartezeit() verwenden? Mit wait() brauchen Sie das nicht zu tun, oder yield() oder sleep(). – Robin

+0

Ich dachte an Ihre eigenen .wait Umsetzung(), aber ja Object.wait() ist eine weitere Möglichkeit, oder möglicherweise Callback.wait(), dann kann der Rückruf nennen this.notifyAll() – Cogsy

0

Bitte ignorieren Sie, wenn Sie nicht JMS verwenden. Wenn Sie JMS verwenden, können Sie eine QueueRequestor verwenden, die eine Implementierung der Request Reply integration pattern ist.

Das heißt, wird die folgende Aufruf synchron an den Client, obwohl Asynchron-Nachrichten verwendet werden:

QueueRequestor requestor = null; 
try { 
    requestor = new QueueRequestor(session, queue); 
    Message response = requestor.send(request); 
} finally { 
    if (requestor == null) { 
     try { 
      requestor.close(); 
     } catch (JMSException e) { 
      // log error message 
     } 
    } 
} 
+0

Es ist gerade TCP nicht JMS –

1

Ja, nutzen Sie Ihre bestehende Methode, wie Sie vorschlagen. Erstellen Sie den Rückruf in Ihrem Synchronisierungsmethodenaufruf, der mit dem Aufruf der Synchronisierungsmethode über wait()/notify() koordiniert wird. Die Synchronisierungsmethode ruft die asynchrone und dann wait() auf. Wenn der Rückruf aufgerufen wird, ruft er notify() auf, um die Synchronisierungsmethode zu aktivieren, damit die Ergebnisse zurückgegeben werden können.