GWT:用异步RPC替换阻塞调用

时间:2012-05-28 14:10:41

标签: java asynchronous rpc blocking

我正在将原生Java应用程序转换为GWT。与服务器的通信仅在状态更改期间发生,到目前为止已通过阻止操作来处理。

e.g。 当前同步逻辑:

void onUserClickedSync() {
    downloadData(); // blocking operation
    uploadData(); // blocking operation
    setState(DONE);
}

如何使用异步回调替换阻塞操作?

我目前的想法是基本上添加一堆额外的“忙”状态,这些状态不做任何事情。然后我将使用来自RPC的回调来触发下一个状态,逻辑可以继续。

e.g。 同步逻辑将变为:

void onUserClickedSync() {
    rpc.downloadData(new AsyncCallback<Data> {
        public void onSuccess(Data result) {
            //...
            onDownloaded();
        }
        //...
    });
    setState(WAITING_FOR_DOWNLOAD);
}

void onDownloaded() {
    rpc.uploadData(new AsyncCallback<Void> {
        public void onSuccess(Void void) {
            //...
            setState(DONE);
        }
    //...
    });
    setState(WAITING_FOR_UPLOAD);
}

这种方法有效吗?我需要注意什么?

编辑:以伪代码重写我的例子,因为它们非常不清楚。

2 个答案:

答案 0 :(得分:1)

在设计用于远程交互的界面时,通常应该尽可能粗略地进行操作,以减少延迟。

特别是,您可以将“下载”和“上传”合并为单个操作。这样,您可以减少单次往返的延迟并消除多个等待状态。

答案 1 :(得分:1)

好的,抱歉纠缠于你的问题,但这个例子对我来说并不是很清楚。

既然我已经更好地处理了这种情况,我认为你的方法是可行的。 请注意,当回调改变系统状态时,没有“副作用”可能会与同时发生的其他事件发生冲突。

具体而言,目前尚不清楚你是否“等待多次回调”(即用户开始上传4次,因此你可能会得到4次回调,不一定是“正确的顺序”)。另外,uploaddata方法是否有可能在相应的downloaddata之前结束?

一般情况下,你必须要小心,因为虽然你之前的代码牺牲了对可预测性的响应性(例如,在第一次下载完成之前没有任何事情发生),现在事情发生在一个更难以预测的顺序中,你有时会引入一些相当微小的错误难以正确诊断或复制。

我们没有看到应用程序的其余部分,因此不清楚回调之间可能会发生什么,但我建议您对此非常小心,并且还要使回调错误处理特别健壮(即,什么如果上传中途失败会发生什么?你是否仍然收到来自服务器的回调,告诉你它已经中止了?你移动到什么状态呢?)