【发布时间】:2015-06-05 00:57:46
【问题描述】:
我有一个连接到 JBoss/MS-SQL 后端的 Flex 应用程序。我们的一些客户在他们的 JBoss 前面有一个代理服务器,超时时间为 90 秒。在我们的应用程序中,对于复杂标准,搜索最多可能需要 2-3 分钟。由于代理不够聪明,无法识别 AMF 的保活 ping,因此代理会向客户端发送 503,这在 Flex 领域会变成“通道调用失败”事件。在搜索 SO 和其他地方,这似乎是一个常见的问题。我们不能对代理做任何事情或延长超时,应用程序需要处理它。
当然,后端会继续处理并最终将结果发送给客户端。但是用户会收到一条丑陋的错误消息,并认为该应用程序已损坏。
我确定的解决方案是消耗 CCF 错误并让客户端继续等待。我已经完成了第一部分,但我不知道如何让客户端的处理程序保持活动状态以接收数据(和/或在必要时消耗另一个超时)。
当前错误处理程序:
private function handleSearchError(event : FaultEvent) : void {
if (event.fault.faultCode == "Channel.Call.Failed") {
event.stopImmediatePropagation(); // doesn't seem to help
return;
}
if (searchProgress != null) {
PopUpManager.removePopUp(searchProgress);
searchProgress = null;
}
etc...
}
这是设置:
<mx:Button id="btnSearch" label="
{resourceManager.getString('recon_perspective',
'ReconPerspective.ReconView.search')}" icon="{iconSearch}"
click="handleSearch()" includeIn="search, default"/>
还有:
<mx:method name="search" result="event.token.resultHandler(event);"
fault="handleSearchError(event);"/>
开始通话:
var token : AsyncToken = null;
token = sMSrv.search(searchType.toString(), getSearchMode(), criteria,
smartMatchParent.isArchiveMode);
searchProgress = LoadProgress(PopUpManager.createPopUp
(FlexGlobals.topLevelApplication as DisplayObject, LoadProgress, true));
searchProgress.title = resourceManager.getString('matching', 'smartmatch.loading.trans');
searchProgress.token = token;
searchProgress.showCancelButton = true;
PopUpManager.centerPopUp(searchProgress);
token.resultHandler = handleSearchResults;
token.cancelSearch = false;
所以我的问题是如何让 handleSearch 和 handleSearchError 保持活动状态以使用来自服务器的事件?
我在浏览器中使用 WebDeveloper 验证了数据是从服务器返回的,以观察网络流量,如果您让应用刷新该屏幕,则会显示数据。
【问题讨论】:
-
你能显示启动呼叫的代码吗?在代理超时后,您如何确定客户端实际上正在接收数据?
-
不会每 15 秒(或其他)发送/接收一些东西来保持连接打开吗?设置一个计时器,每 15 秒进行一次简单的无意义的发布/响应,直到您的主要响应出现,这样后端和客户端之间的一切都知道它仍在工作。
-
是的,我试过了。我放入了一个计时器,其处理程序每 60 秒进行一次微不足道的后端调用,但它会在浏览器客户端中排队,直到搜索完成。所以这没有帮助。正如我所提到的,代理将常规 AMF 保持活动状态视为不同的会话。
-
应用程序可以显示进度吗?报告进度不会保持渠道畅通吗?无论如何,您应该为您的用户提供一些东西。良好的用户体验需要向他们展示总体百分比和/或完成的任务。
-
@moot 是的,我可以这样做,这将是比使其正常工作更广泛的应用程序更改。这是一个大型且成熟的项目,不仅仅是 Web 界面,因此后端更改越少越好。
标签: actionscript-3 events event-handling