2010-01-10 3 views
3

Я использую Google AppEngine вместе с PyAMF для поддержки RemoteObject. В моем коде Flex я делаю сразу несколько вызовов метода RemoteObject, которые, как правило, группируют сообщения AMF в один HTTP-запрос.Как предотвратить удаленный файл RemoteObject от пакетных сообщений AMF?

В большинстве случаев это нормально, но AppEngine применяет некоторые строгие ограничения на запрос (в этом случае я нажимаю DeadlineExceededError - максимум 30 секунд). Ожидается, что несколько методов обслуживания превысят 10 секунд, и если они будут удалены RemoteObject в 1 HTTP, вы увидите, где это происходит.

Теперь вы можете сказать, что рефакторинг ваших звонков по телефону, и это тоже происходит, но на самом деле вопрос не задается здесь. Есть ли способ предотвратить использование Flex RemoteObject для пакетных запросов AMF для таких ситуаций?

Я проделал большое количество Googling по этому вопросу и придумал bupkis. Мне кажется, что мне нужно будет выполнить пользовательскую версию mx.messaging.channels.AMFChannel или что-то в этом роде, которое кажется слишком хардкорным для такой функции.

У кого-нибудь есть указатели/проницательность?

ответ

1

Отъезд concurrency property на RemoteObject.

+0

Глядя на эти документы (и исправьте меня, если я ошибаюсь), моя проблема кажется немного отличающейся - я хотел бы убедиться, что каждое сообщение AMF, отправленное через RemoteObject, отправляется одним HTTP-запрос (и возможность совершать несколько вызовов без ошибок). Я вырыл Flex SDK, и не кажется, что RPC Messaging выполняет пакетные запросы, что заставляет меня предположить, что это происходит в базовом NetConnection? – njoyce

+2

Да. Ты прав. Flash Player ждет, пока кадр не завершит отправку всех запрошенных сетевых запросов. Если вы перемещаете каждый запрос на другой кадр (например, с помощью callLater), он гарантирует, что каждый запрос фактически использует другой HTTP-запрос. –

+0

Спасибо! Эта информация была достаточной для того, чтобы я мог поставить свои вызовы в очередь и пошатнуть их соответственно. – njoyce

0

вы можете создать пул соединений и создать еще один класс, который запускает соединения. Ваше приложение не устанавливает соединения, а только кормит пул.

+0

Можете ли вы привести пример того, как это выглядит? Я n00b, когда дело доходит до Flex .. – njoyce

0

Я думаю, что нравится, нравится делать, чтобы предотвратить дозирование AMF. Это т. хорошо подходит для нескольких небольших вызовов, но если у вас очень интенсивные серверные вызовы, вам следует предотвратить пакетную обработку AMF. Зачем?

  • один АИФ вызов => один поток на стороне сервера
  • несколько АМФ вызовов => все запросы получить обрабатываются через несколько потоков

псевдокоде:

private static var _collectionFillIndex:int; 
    private static var _collectionsToFill:Array = []; 

    public function doFillCollections():void { 
     _collectionFillIndex = _collectionsToFill.length; 
     Application.application.addEventListener(Event.ENTER_FRAME, onFrameEventHandler); 
    } 

    private function onFrameEventHandler(event:Event):void { 
     --_collectionFillIndex; 
     if(_collectionFillIndex < 0) { 
      Application.application.removeEventListener(Event.ENTER_FRAME, onFrameEventHandler); 
      return; 
     } 
     _collectionsToFill[ _managerFillIndex ].fill(); 
    } 
1

группирования Запросы AMF в HTTP выполняются на уровне NetConnection. Поэтому, к сожалению, лучший способ остановить запросы AMF от пакетной обработки - реализовать пользовательскую версию mx.messaging.channels.AMFChannel. Однако это довольно легко сделать, и, возможно, проще запросить очереди и вызвать их позже.

Вместо использования по умолчанию AMFChannel использовать следующие вместо:

package services 
{ 
    import flash.events.AsyncErrorEvent; 
    import flash.events.IOErrorEvent; 
    import flash.events.NetStatusEvent; 
    import flash.events.SecurityErrorEvent; 
    import flash.net.NetConnection; 

    import mx.messaging.MessageResponder; 
    import mx.messaging.channels.AMFChannel; 

    public class NonBatchingAMFChannel extends mx.messaging.channels.AMFChannel 
    { 
     public function NonBatchingAMFChannel(id:String = null, uri:String = null) 
     { 
      super(id, uri); 
     } 

     override protected function internalSend(msgResp:MessageResponder):void 
     { 
      // AMFChannel internalSend 
      super.internalSend(msgResp); 
      // Reset the net connection. 
      _nc = new NetConnection(); 
      _nc.addEventListener(NetStatusEvent.NET_STATUS, statusHandler); 
      _nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler); 
      _nc.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler); 
      _nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR, asyncErrorHandler); 
      _nc.connect(this.url); 
     } 
    } 
} 

Волшебство происходит путем переопределения метода internalSend. После запуска метода super internalSend (который ставит очередь в ответ на сообщение) мы сбросим NetConnection и все его обработчики событий. Это дает новый NetConnection, готовый к следующему удаленному сообщению.

Примечание: Важно отметить, что это пользовательский не-пакетный AMFChannel, если вы хотите надежно отправлять сообщения AMF, вам нужно будет скопировать этот класс и расширить класс mx.messaging.channels.SecureAMFChannel.

Кредит: Кредит Нику Джойсу, который ответил на его вопрос здесь, на другом форуме.

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