【问题标题】:How to keep event handlers alive in Actionscript 3如何在 Actionscript 3 中使事件处理程序保持活动状态
【发布时间】: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


【解决方案1】:

我很有经验,但这有帮助吗?

private function handleSearchError(event : FaultEvent) : void {

if (event.fault.faultCode == "Channel.Call.Failed") {
   event.stopImmediatePropagation();  // doesn't seem to help
     if(event.isImmediatePropagationStopped(true)) {
         //After stopped do something here?
}

   return;
}

if (searchProgress != null) {
    PopUpManager.removePopUp(searchProgress);
    searchProgress = null;
}

etc...

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 2011-04-04
    相关资源
    最近更新 更多