Как запретить RemoteObject пакетировать сообщения AMF вместе? - PullRequest
3 голосов
/ 10 января 2010

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

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

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

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

Кто-нибудь имеет какие-либо указатели / понимание?

Ответы [ 5 ]

1 голос
/ 25 апреля 2012

Пакетирование запросов 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 класс.

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

1 голос
/ 11 января 2010

Проверьте свойство параллелизма в RemoteObject.

0 голосов
/ 23 апреля 2012

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

  • один вызов 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();
    } 
0 голосов
/ 24 ноября 2011

Ну, очевидно, один из способов - это запустить собственный AMFChannel, который не использует NetConnection ... Я не пробовал, поэтому не знаю, насколько хорошо он работает. http://blogs.adobe.com/pfarland/2008/06/using_amf_with_flashneturlload.html

0 голосов
/ 11 января 2010

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

...