Sagen wir, wir haben eine Client
Klasse mit Methode zum Senden von Nachrichten an die Serverwarteschlange. Es wird auch abonniert Warteschlange und Server eine Benachrichtigung zurück an alle Clients senden, wenn es eine neue Nachricht von einem der registrierten Kunden erhält:Gibt es eine bessere Möglichkeit, Abonnentenänderungen nachzuverfolgen?
public class Client {
public void sendMessage(String message) {
// Method to send messages to server
}
public void messageDelivered(String receivedMessage) {
// This is a method subscribed successfull message delivering
}
}
In einer anderen Klasse würde Ich mag meinen Client instansiate, eine Nachricht senden und prüfen, ob sie erfolgreich gesendet wurde:
public class ParentClass {
protected boolean checkConnection() {
Client client = new Client(); // Lets skip all configuration and connection details
String testMessage = "Test message";
client.sendMessage(testMessage);
// Check that messageDelivered() was called in client with testMessage parameter
return result;
}
}
Was ist der beste Weg, um zu überprüfen, ob messageDelivered()
asynchroniously innerhalb Mutter checkConnection()
Methode aufgerufen wurde?
Ich sehe die einfache Lösung, die eine Fahne in Client-Klasse zu erstellen, aktualisieren, wenn die Nachricht geliefert wird, und wickeln Überprüfung dieser Flagge in einigen von der Zeit in Elternklasse beschränkt Schleife. Aber diese Option sieht sehr schmutzig für mich aus. Vielleicht gibt es im Java SDK einige bessere Methoden oder "Watcher"?
Wenn es asynchron aufgerufen, es kann nicht in 'checkConnection()' genannt werden, sind diese zwei sich gegenseitig ausschließende in Ihrem Codebeispiel. –
@ M.Prokhorov kann es in folgender Weise getan werden: \t Wiederholungen = 1000; \t do { \t if (client.deliveredResult == true) { \t // Erfolg \t} \t Schlaf (1000); \t Wiederholungen--; \t} while (Versuche> 0); und client.deliveredResult wird auf "true" gesetzt, wenn 'messageDelivered()' ausgeführt wird. Aber ich frage mich, ob es eine elegantere Lösung gibt. (Sorry, es vermasselte die Formatierung) – diko
Warum fügst du keinen Callback ('Runnable' oder' Consumer) 'als zweiten Parameter zu' sendMessage' hinzu? Ein Client wird diesen Parameter auslösen, wenn eine erfolgreiche Antwort vom Server kommt –
Andrew