2017-08-30 2 views
3

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"?

+0

Wenn es asynchron aufgerufen, es kann nicht in 'checkConnection()' genannt werden, sind diese zwei sich gegenseitig ausschließende in Ihrem Codebeispiel. –

+0

@ 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

+0

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

Antwort

2

Vielleicht so etwas?

public class Client { 
    private Runnable runnable; 

    public void sendMessage(String message, Runnable runnable) { 
     // Method to send messages to server 
     this.runnable = runnable; 
    } 

    public void messageDelivered(String receivedMessage) { 
     // This is a method subscribed successfull message delivering 
     this.runnable.run(); 
    } 
} 

Dann ein Runnable in Ihrem ParentClass erstellen und an den Client übergeben.

public class ParentClass { 

    protected boolean checkConnection() { 
     Client client = new Client(); // Lets skip all configuration and connection details 
     String testMessage = "Test message"; 
     // Check that messageDelivered() was called in client with testMessage parameter 
     MyRunnable runnable = new MyRunnable(); 
     client.sendMessage(testMessage, runnable); 

     try { 
     runnable.wait(10000); // Wait for 10 seconds 
     } catch(InterruptedException e) { 
     e.printStackTrace(); 
     } 

     return runnable.getResult(); 
    } 
} 

Runnable-Klasse:

public class MyRunnable implements Runnable { 

    private boolean result; 

    public MyRunnable() { 
     this.result = false; 
    } 

    @Override 
    public void run() { 
     this.result = true; 
     this.notifyAll(); 
    } 

    public boolean getResult() { 
     return this.result; 
    } 

} 
+0

'runnable =() hilft => {/ * Einige Code hier * /}; ' – Andrew

+0

Ja, das ist eine gute Lösung, wenn ich etwas habe, das ich zur Ausführung verschieben kann. Aber ich möchte die Methode checkConnection() nicht beenden, bevor ich das Ergebnis kenne (es sollte auf eine erfolgreiche Zustellung warten oder eine Ausnahme auslösen, wenn es nicht passiert). 'CheckConnection()' Methode ist ein Gesundheits-Check-Verbindung zum Server zu überprüfen, und es sollte Ergebnis nach oben (sorry, wenn ich mit dem Void-Methode Typ verwirrt) return – diko

+0

@diko Ok, so dass Sie einen Booleschen Wert zurückgeben möchten, der angibt, dass die Serververbindung funktioniert? –

Verwandte Themen