2015-03-31 5 views
2

У меня есть приложение Flex, которое подключается к серверу JBoss/MS-SQL. Некоторые из наших клиентов имеют прокси-сервер перед своим JBoss с тайм-аутом 90 секунд. В нашем приложении есть поисковые запросы, которые могут занимать до 2-3 минут для сложных критериев. Поскольку прокси-сервер недостаточно умен, чтобы узнать, что AMF держит в живых, за то, что они прокси отправляет 503 клиенту, который на земле Flex становится событием «Call Call Failed». При поиске SO и других мест это, похоже, является общей проблемой. Мы ничего не можем сделать про прокси или удлинить таймаут, приложение должно его обработать.Как сохранить обработчики событий в ActionScript 3

Конечно, back-end продолжает обрабатывать и в конечном итоге передает результаты клиенту. Но пользователь получает уродливое сообщение об ошибке и предполагает, что приложение сломалось.

Решение, на котором я остановился, заключается в том, чтобы уничтожить ошибку 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

+0

Не отправлял/получал что-нибудь каждые 15 (или что-то еще) секунд, чтобы открыть соединение? Настройте таймер, чтобы сделать простой бессмысленный пост/ответ каждые 15 секунд, пока ваш основной ответ не появится, поэтому все, что находится между бэкэндом и клиентом, знает, что оно все еще работает. – moot

+0

Да, я пробовал это. Я помещаю таймер, чей обработчик делает тривиальный внутренний вызов каждые 60 секунд, но он ставится в очередь в браузере, пока поиск не завершится. Так что это не помощь. И, как я уже упоминал, обычный AMF продолжает жить, как прокси-сервер, рассматривается как другой сеанс. – WPrecht

ответ

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

}

Смежные вопросы