在java中实现同步网络调用等待ack消息?

时间:2009-05-20 12:00:00

标签: java asynchronous synchronous

在Java中完成方法调用之前,您将如何实现等待的等效?

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

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

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

4 个答案:

答案 0 :(得分:2)

将.wait()添加到回调类将是最简单的路径。它可以坐在那里旋转一些标志,直到你的回调切换它,只需确保在你的循环中包含Thread.yield()或.sleep()。

保存必须重写替代阻止通信通道。

答案 1 :(得分:1)

简短回答:是的。我很喜欢使用类库中的内容,你所描述的内容听起来很像Observer模式,你已经有了Observer / Observable接口,假设你正在使用J2SE。

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您没有使用JMS,请忽略。

如果您使用的是JMS,那么您可以使用QueueRequestor,这是Request Reply integration pattern的实现。

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

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