0

你将如何在 Java 中实现等价的方法调用,直到完成方法调用?

基本上我想要做的是有一种方法,它通过网络向服务器应用程序发送消息,并等待它从服务器获得适当的 Ack 消息,操作成功完成或操作失败并出现错误消息。

我已经有了我的方法的非阻塞版本,它传递了一个回调类,其中有一个在回调中调用的方法。

构造一个回调类将其传递给我以前的方法然后执行等待操作并在回调上让该类执行通知是否有意义?

4

4 回答 4

2

将 .wait() 添加到回调类将是最简单的路径。它可以在某个标志上旋转,直到您的回调切换它,只要确保在循环中包含 Thread.yield() 或 .sleep() 即可。

无需重写替代阻塞通信通道。

于 2009-05-20T12:07:26.077 回答
1

是的,按照您的建议使用您现有的方法。在同步方法调用中创建回调,该回调将通过 wait()/notify() 与同步方法调用协调。同步方法将调用异步方法,然后调用 wait()。当回调被调用时,它会调用 notify() 来唤醒同步方法以便返回结果。

于 2009-05-20T13:29:22.447 回答
1

简短的回答:是的。我已经很喜欢使用类库中的内容,您所描述的内容听起来很像观察者模式,假设您使用的是 J2SE,那么您已经拥有观察者/可观察的接口。

编辑:我的咖啡出了点问题 :) 显然,我的意思是检查 java.util.concurrent 包中的内容,特别是 Future<> 和 ExecutorService 类。

于 2009-05-20T12:03:16.847 回答
0

如果您不使用 JMS,请忽略。

如果您使用的是 JMS,那么您可以使用QueueRequestor,它是Request Reply 集成模式的实现。

也就是说,即使使用了异步消息,以下调用对客户端来说也是同步的:

QueueRequestor requestor = null;
try {
    requestor = new QueueRequestor(session, queue); 
    Message response = requestor.send(request);
} finally {
    if (requestor == null) {
        try {
            requestor.close();
        } catch (JMSException e) {
            // log error message
        }
     }
}
于 2009-05-20T12:18:57.813 回答