3

私はGoogleAppEngineをPyAMFと組み合わせて使用​​して、RemoteObjectのサポートを提供しています。私のFlexコードでは、一度に複数のRemoteObjectメソッド呼び出しを行い、AMFメッセージを単一のHTTPリクエストにバッチ処理する傾向があります。

ほとんどの場合、これは問題ありませんが、AppEngineはリクエストごとにいくつかの厳密な制限を適用します(この場合、DeadlineExceededError-最大30秒に達します)。多くのサービスメソッドは10秒以上かかると予想され、これらがRemoteObjectによって1つのHTTPにバッチ処理されると、これがどこに向かっているのかがわかります。

今、あなたはあなたのサービスコールをリファクタリングすると言うことができます、そしてそれはまた起こっています、しかし実際にはここで尋ねられている質問ではありません。Flex RemoteObjectがこのような状況でAMFリクエストをバッチ処理するのを防ぐ方法はありますか?

私はこのテーマについてかなりの量のグーグルを行い、ブプキを思いついた。私には、カスタムバージョンmx.messaging.channels.AMFChannelまたはその性質のものを実装する必要があるように思われます。これは、このような機能にはハードコアすぎるようです。

誰かが何か指針/洞察を持っていますか?

4

5 に答える 5

1

RemoteObjectの同時実行プロパティを確認してください。

于 2010-01-11T15:29:22.267 に答える
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メソッドをオーバーライドすることで起こります。スーパーinternalSendメソッド(メッセージレスポンダーをキューに入れる)を実行した後、NetConnectionとそのすべてのイベントハンドラーをリセットします。これにより、新しいNetConnectionが次のリモーティングメッセージに対応できるようになります。

注:これはカスタムの非バッチAMFChannelであることに注意してください。AMFメッセージを安全に送信する場合は、このクラスをコピーしてmx.messaging.channels.SecureAMFChannelクラスを拡張する必要があります。

クレジット:別のフォーラムで彼の質問に答えたニックジョイスのクレジット。

于 2012-04-24T21:54:31.967 に答える
0

接続のプールを作成し、接続をトリガーする別の別のクラスを作成できます。アプリケーションは接続を確立せず、プールにフィードするだけです。

于 2010-01-11T13:30:38.060 に答える
0

ええと、1つの方法はどうやらNetConnectionを使用しない独自のAMFChannelをロールすることです...私はそれを試したことがないので、それがどれほどうまく機能するかわかりません。 http://blogs.adobe.com/pfarland/2008/06/using_amf_with_flashneturlload.html

于 2011-11-24T07:44:34.297 に答える
0

njoyceがやりたいのは、AMFのバッチ処理を防ぐことだと思います。これすなわち。複数の小さな呼び出しには適していますが、サーバーを集中的に使用する呼び出しがある場合は、AMFバッチ処理を防止する必要があります。なんで?

  • 1つのAMF呼び出し=>サーバー側の1つのスレッド
  • 複数の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();
    } 
于 2012-04-23T12:41:05.210 に答える