java - GWT : Replacing blocking calls with async RPCs

标签 java asynchronous rpc blocking

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

例如当前同步逻辑:

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

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

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

例如同步逻辑将变为:

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

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

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

最佳答案

好的,很抱歉用问题困扰您,但这个例子对我来说并不是很清楚。

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

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

一般来说,您必须小心,因为虽然您以前的代码牺牲了响应能力以实现可预测性(例如,在第一次下载完成之前不会发生任何事情),但现在事情发生的顺序更加不可预测,有时您可能会引入微妙的错误,这些错误将非常严重很难正确诊断或重现。

我们没有看到应用程序的其余部分,因此不太清楚回调之间可能会发生什么,但我敦促您对此非常小心,并且还要使回调错误处理特别健壮(即,什么)如果上传中途失败,会发生这种情况吗?您是否还会收到服务器的回调,告诉您上传已中止?然后您会进入什么状态?)

关于java - GWT : Replacing blocking calls with async RPCs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786041/

相关文章:

c# - 在服务中使用 Task.Run 作为同步方法

Android异步服务调用策略

rpc - 最多一次和恰好一次

embedded - 微 Controller 到微 Controller 通信库(通过 UART/RS232)

java - ClassCastException 冒险

java - 单击 JButton 时椭圆形不改变颜色 - Java Swing

java - 修复 java 按键操作中的延迟问题

android - 将文件从 Assets 复制到数据文件夹后,数据未首次在 android 中显示

php - 来自 PHP 的同步 AMQP

java - 在 Java 中复制 Unix 排序的默认行为