有没有更好的方法来跟踪订阅者的变化?

Is there any better way to track subscriber changes?

假设我们有一个 Client class 方法将消息发送到服务器队列。它还订阅了队列,当服务器收到来自任何已注册客户端的新消息时,服务器将向所有客户端发回通知:

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

在另一个 class 中,我想实例化我的客户端,发送一条消息并检查它是否发送成功:

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() 是否在父 checkConnection() 方法中被异步调用的最佳方法是什么?

我看到了在客户端 class 中创建标志的简单解决方案,在传递消息时更新它,并在父 class 中的某个受时间限制的循环中包装对该标志的检查。但是这个选项对我来说看起来很脏。也许 Java SDK 中有一些更好的做法或 "watchers"?

也许是这样的?

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

然后在您的 ParentClass 中创建一个 Runnable 并将其传递给客户端。

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

可运行class:

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

}