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



假设我们有一个Client类,其中包含将消息发送到服务器队列的方法。它也订阅了队列,当服务器从任何注册的客户端收到新消息时,它将向所有客户端发送通知:

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

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

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

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

也许是这样的东西?

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

可运行类:

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

最新更新