GWT:更换与异步的RPC阻塞调用
Posted
技术标签:
【中文标题】GWT:更换与异步的RPC阻塞调用【英文标题】:GWT: Replacing blocking calls with async RPCs 【发布时间】:2012-05-28 14:10:41 【问题描述】:我正在将本机 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 Do nothing...”时您期望发生的其他事情 好的,这有点令人困惑。删除它。 :) 好的,那么在第 3 步之后你会做什么呢?进入忙等待循环等待回调从外部设置状态? 我认为我不需要做任何事情 - GWT 在 AFAIK 的后台处理事件调度。 那么是什么阻止了你正在运行的线程不停地通过 3、4、5、6 呢?你必须有类似锁的东西才能等待,这是在实际代码中的某处声明的吗? 【参考方案1】:好的,很抱歉用问题来纠缠你,但这个例子对我来说不是很清楚。
现在我对情况有了更好的处理,是的,我认为你的方法是可行的。 请注意,当回调更改系统状态时,不会出现可能与同时发生的其他事件发生冲突的“副作用”。
具体而言,不清楚您是否可能“等待多个回调”(即用户开始 4 次上传,因此您可能会收到 4 次回调,不一定按照“正确的顺序”)。另外,uploaddata方法是否有可能在相应的downloaddata之前结束?
一般而言,您必须小心,因为虽然您之前的代码为了可预测性而牺牲了响应能力(例如,在第一次下载完成之前什么都不会发生),但现在事情会以更不可预测的顺序发生,您有时可能会引入一些微妙的错误很难正确诊断或重现。
我们看不到应用程序的其余部分,因此不太清楚回调之间可能会发生什么,但我敦促您对此非常小心,并使回调错误处理特别健壮(即,什么如果上传中途失败会发生什么?您是否仍然收到来自服务器的回调告诉您它已中止?您移动到什么状态?)
【讨论】:
不用担心。问题 - 我原来的例子是垃圾。描述问题是我绝对需要做的事情......无论如何,将(至少最初)确保系统在任何时候都只等待一个回调。我需要尽我所能限制现阶段更改的复杂性...【参考方案2】:在为远程交互设计界面时,您通常应该使操作尽可能粗粒度,以减少延迟。
特别是,您可以将“下载”和“上传”合并为一个操作。通过这种方式,您可以减少单次往返的延迟并消除多个等待状态。
【讨论】:
以上是关于GWT:更换与异步的RPC阻塞调用的主要内容,如果未能解决你的问题,请参考以下文章