2017-08-30 14 views
3

Clientクラスには、メッセージをサーバーキューに送信するメソッドがあります。またキューに登録され、それが登録されているクライアントのいずれかから新しいメッセージを受信したときに、サーバがすべてのクライアントに戻って通知が送信されます:私は私のクライアントをinstansiateしたい別のクラスで加入者の変更を追跡するためのより良い方法はありますか?

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 
    } 
} 

、メッセージを送信し、それはsuccessfuly送信されたことを確認します

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; 
    } 
} 

messageDelivered()がasynchroniously親checkConnection()メソッド内で呼ばれたことを確認するための最良の方法は何ですか?

クライアントクラスでフラグを作成し、メッセージが配信されたときにフラグを更新し、親クラスの時間によって制限されるループでこのフラグのラップチェックを行うという簡単な解決策があります。しかし、このオプションは私のために非常に汚く見えます。たぶん、Java SDKには、より良い習慣やウォッチャーがありますか?

+0

それは非同期に呼び出された場合、それは 'checkConnection()'内部で呼び出すことはできません、これらの二つは、あなたのコードサンプルでは、​​相互に排他的です。 –

+0

@ M.Prokhorovそれは以下の方法で行うことができます: \t retries = 1000; \t DO { \t場合(client.deliveredResult ==真){ \t //成功 \t} \t睡眠(1000); \t retries--; \t} while(再試行回数> 0); 'messageDelivered()'が実行されると、 とclient.deliveredResultはtrueに設定されます。しかし、より洗練されたソリューションがあるかどうかは疑問です。 (申し訳ありません、それはフォーマットを混乱させました) – diko

+0

なぜ 'sendMessage'に2番目のパラメータとしてコールバック(' Runnable'または 'Consumer )を追加しませんか?成功した応答がサーバーから来たときにクライアントがそのパラメータをトリガーします。 – Andrew

答えて

2

多分それは何か?

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(); 
    } 
} 

は、その後、あなたのParentClassRunnableを作成し、それをクライアントに渡します。

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クラス:

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 =()=> {/ *ここではいくつかのコード* /}; ' – Andrew

+0

実行するために延期できるものがあれば、これは良い解決策です。しかし、結果を知る前にcheckConnection()メソッドを終了する必要はありません(成功した配送を待つか、発生しない場合は例外をスローする)。 'checkConnection()'メソッドは、サーバへの接続を確認するためのヘルスチェックで、結果を一番上に返すべきです(voidメソッドの型と混同した場合はごめんなさい)。 – diko

+0

@diko Okだから、サーバー接続が機能していますか? –

関連する問題