首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止RemoteObject批量发送AMF消息?

如何防止RemoteObject批量发送AMF消息?
EN

Stack Overflow用户
提问于 2010-01-11 00:25:43
回答 5查看 2.3K关注 0票数 3

我正在使用谷歌AppEngine,结合PyAMF来提供RemoteObject支持。在我的Flex代码中,我同时进行了几个RemoteObject方法调用,这倾向于将AMF消息批处理到单个HTTP请求中。

大多数情况下,这没什么问题,但AppEngine对每个请求应用了一些严格的限制(在本例中,我达到了DeadlineExceededError - max 30秒)。许多服务方法预计需要10秒以上的时间,如果这些方法被RemoteObject批处理成1HTTP..你知道这是怎么回事了。

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

我已经在这个主题上做了相当多的谷歌搜索,并提出了bupki。在我看来,我需要实现一个自定义版本的mx.messaging.channels.AMFChannel或类似的东西,对于这样的功能来说,这似乎太核心了。

有人有什么建议/见解吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-01-11 23:29:22

在RemoteObject上查看concurrency property

票数 1
EN

Stack Overflow用户

发布于 2012-04-25 05:54:32

将AMF请求批处理到HTTP是在NetConnection级别进行的。因此,不幸的是,阻止AMF请求批处理的最好方法是实现一个自定义版本的mx.messaging.channels.AMFChannel。然而,这很容易做到,而且可能比将请求排队并稍后调用它们更容易。

不使用默认的AMFChannel,而是使用以下内容:

代码语言:javascript
复制
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类。

致谢:感谢Nick Joyce,他在另一个论坛上回答了他的问题。

票数 1
EN

Stack Overflow用户

发布于 2010-01-11 21:30:38

您可以创建一个连接池,然后创建另一个触发连接的类。您的应用程序不会建立连接,而只是提供给池。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2037613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档