У меня есть приложение 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 в браузере, чтобы посмотреть сетевой трафик, и если приложение вызывает обновление этого экрана, данные будут отображаться.
Можете ли вы показать код, который инициирует вызов? Как вы определили, что клиент фактически получает данные после истечения срока прокси-сервера? – Aaron
Не отправлял/получал что-нибудь каждые 15 (или что-то еще) секунд, чтобы открыть соединение? Настройте таймер, чтобы сделать простой бессмысленный пост/ответ каждые 15 секунд, пока ваш основной ответ не появится, поэтому все, что находится между бэкэндом и клиентом, знает, что оно все еще работает. – moot
Да, я пробовал это. Я помещаю таймер, чей обработчик делает тривиальный внутренний вызов каждые 60 секунд, но он ставится в очередь в браузере, пока поиск не завершится. Так что это не помощь. И, как я уже упоминал, обычный AMF продолжает жить, как прокси-сервер, рассматривается как другой сеанс. – WPrecht