2015-03-31 82 views
2

我有一个连接到JBoss/MS-SQL后端的Flex应用程序。我们的一些客户在其JBoss之前有一个代理服务器,超时时间为90秒。在我们的应用程序中,对于复杂的标准,搜索可能需要2-3分钟。由于代理服务器不够聪明,无法识别AMF的保活状态,因为代理服务器向客户端发送了503消息,这在Flex域中成为“Channel Call Failed”事件。在搜索SO和其他地方时,这似乎是一个常见问题。我们无法对代理做任何事情或延长超时,应用程序需要处理它。如何保持事件处理程序在Actionscript 3中保持活动状态

当然,后端会继续处理并最终将结果发送给客户端。但用户得到一个丑陋的错误消息,并假定应用程序已损坏。

我已经解决的解决方案是消费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在浏览器中返回以观察网络流量,并且如果您导致应用程序刷新该屏幕,则会显示数据。

+0

你也可以说发起呼叫的代码?你是如何确定客户端在代理服务器超时后实际接收数据的? – Aaron 2015-04-02 20:41:06

+0

每15(或任何)秒发送/接收一些东西会使连接保持打开状态?设置一个计时器,每15秒执行一次简单的无意义的发布/响应,直到您的主要响应来临,因此后端和客户端之间的所有内容都知道它仍在工作。 – moot 2015-04-06 17:24:33

+0

是的,我试过了。我放入一个定时器,它的处理程序每​​60秒钟发出一次简单的后端调用,但在浏览器客户端中排队,直到搜索完成。所以这没有帮助。 正如我所提到的,常规的AMF保持活跃状态​​被代理视为不同的会话。 – WPrecht 2015-04-06 18:51:19

回答

0

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

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... 

}

相关问题