我有一個連接到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在瀏覽器中返回以觀察網絡流量,並且如果您導致應用程序刷新該屏幕,則會顯示數據。
你也可以說發起呼叫的代碼?你是如何確定客戶端在代理服務器超時後實際接收數據的? – Aaron 2015-04-02 20:41:06
每15(或任何)秒發送/接收一些東西會使連接保持打開狀態?設置一個計時器,每15秒執行一次簡單的無意義的發佈/響應,直到您的主要響應來臨,因此後端和客戶端之間的所有內容都知道它仍在工作。 – moot 2015-04-06 17:24:33
是的,我試過了。我放入一個定時器,它的處理程序每60秒鐘發出一次簡單的後端調用,但在瀏覽器客戶端中排隊,直到搜索完成。所以這沒有幫助。 正如我所提到的,常規的AMF保持活躍狀態被代理視爲不同的會話。 – WPrecht 2015-04-06 18:51:19