3

我正在使用 Google AppEngine 和 PyAMF 来提供 RemoteObject 支持。在我的 Flex 代码中,我一次调用了多个 RemoteObject 方法,这往往会将 AMF 消息批处理到单个 HTTP 请求中。

大多数时候这很好,但 AppEngine 对每个请求应用了一些严格的限制(在这种情况下,我遇到了 DeadlineExceededError - 最多 30 秒)。许多服务方法预计需要超过 10 秒,如果这些由 RemoteObject 批处理成 1 个 HTTP .. 你会看到这是怎么回事。

现在您可以说重构您的服务调用,这也在继续,但并不是这里真正提出的问题。有没有办法防止 Flex RemoteObject 在这种情况下批量处理 AMF 请求?

我已经在这个主题上进行了大量的谷歌搜索,并提出了 bupkis。在我看来,我需要实现一个自定义版本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 方法。运行 super internalSend 方法(将消息响应者排队)后,我们将重置 NetConnection 及其所有事件处理程序。这为下一条远程消息准备好一个新的 NetConnection。

注意:需要注意的是,这是一个自定义的非批处理 AMFChannel,如果你想安全地发送 AMF 消息,你需要复制这个类并扩展mx.messaging.channels.SecureAMFChannel类。

信用:感谢尼克乔伊斯,他在另一个论坛上回答了他的问题。

于 2012-04-24T21:54:31.967 回答
0

您可以创建一个连接池,并创建另一个触发连接的另一个类。您的应用程序不会建立连接,只会为池提供数据。

于 2010-01-11T13:30:38.060 回答
0

我认为 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();
    } 
于 2012-04-23T12:41:05.210 回答
0

好吧,一种方法显然是推出自己的不使用 NetConnection 的 AMFChannel ......我没有尝试过,所以我不知道它的效果如何。 http://blogs.adobe.com/pfarland/2008/06/using_amf_with_flashneturlload.html

于 2011-11-24T07:44:34.297 回答