2015-03-31 130 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... 

}

相關問題