Flex blazeds channelset深度解析

本文详细解析了Flex如何通过远程对象访问BlazeDS服务的过程。从配置文件的加载到远程服务地址的动态计算,深入介绍了Channel类如何确定正确的访问路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 Flex访问blazeds java服务,网上的讲解、例子很多,因此本文不再赘述,本文假设大家都基本上了解flex和blazeds java服务。下面提出问题:

       问题:假设发布到tomcat j2ee应用为http://localhost:8080/demo,则我们知道,其对应的blazeds servlet(messagebroker)为http://localhost:8080/demo/messagebroker,实际上flex的remoteobject在访问java blazeds服务时,地址就是http://localhost:8080/demo/messagebroker加上AMF或者其它的channel。

       我们再假设,在remoting-config.xml文件中有一个blazeds服务,如下:

<destination id="demoService" channels="my-amf"> 

       <properties>

           <source>com.blazeds.DemoService</source>

           <scope>application</scope>

       </properties>

    </destination>

       此时,在flex客户端,我们只要定义一个remoteobject即可访问demoService,如下:

    <fx:Declarations>

       <mx:RemoteObject id="ro" destination=" demoService"/>

    </fx:Declarations>

       ro.method1()  //调用demoService的mothod1方法

       这里,我们就疑问了就创建了一个简单的remoteobject对象,只指定了destination,flex是如何知道remoteobject要访问哪个地址的blazeds服务?remoteobject的channelset flex是如何指定的?

 

       剖析:

       1)flex主应用启动的时候,会请求messagebroker,返回services-config.xml配置文件的信息,其实就是一个xml串(内部包含services结点信息、channel结点信息),如下图所示:

 

 

       大家只要设置ServerConfig.as类的set xml函数断点,调试即可得到上图所示信息,ServerConfig的set xml函数代码:

    public static function set xml(value:XML):void

    {

        serverConfigData = value;

        // Reset cached Channels and ChannelSets.

        _channelSets = {};

        _clusteredChannels = {};

        _unclusteredChannels = {};

    }

大家已经很清楚的可以看到,上图所示信息都是我们几个配置文件的内容,services-config.xml、remoting-config.xml、proxy-config.xml和messaging-config.xml。大家尤其要注意的是红色矩形区域:

<endpoint uri="http://{server.name}:{server.port}/demo/..."/>

其实这应该是remoteobject访问blazeds服务的时候,真正的访问地址,那么flex是如何将该地址自动赋予给remoteobject的呢?

2)Channel.as类解析

Remoteobject动态调用mothod1方法后,真正向http://localhost:8080/demo/messagebroker发送请求之前,会创建channel。

       Channel构造函数:public function Channel(id:String = null, uri:String = null),其中uri即刚才的<endpoint uri="http://{server.name}:{server.port}/demo/..."/>,channel会根据用户的访问地址自动计算真正的uri,替换server.name和server.port,代码如下:

    private function calculateEndpoint():void

    {

        if (uri == null)

        {

            var message:String = resourceManager.getString(

                "messaging""noURLSpecified");

            throw new InvalidChannelError(message);

        }

 

        var uriCopy:String = uri;

        var proto:String = URLUtil.getProtocol(uriCopy);

 

        if (proto.length == 0)

            uriCopy = URLUtil.getFullURL(LoaderConfig.url, uriCopy);

 

        if (!URLUtil.hasUnresolvableTokens())

        {

            _isEndpointCalculated = false;   

            return;

        }

       

        uriCopy = URLUtil.replaceTokens(uriCopy);

       

        // Now, check for a final protocol after relative URLs and tokens

        // have been replaced

        proto = URLUtil.getProtocol(uriCopy);

 

        if (proto.length > 0)

            _endpoint = URLUtil.replaceProtocol(uriCopy, protocol);

        else

            _endpoint = protocol + ":" + uriCopy;

 

        _isEndpointCalculated = true;

       

        if (Log.isInfo())

            _log.info("'{0}' channel endpoint set to {1}", id, _endpoint);           

    }

    计算完毕之后,之后所有remoteobject实例访问blazeds服务都用该endpoint uri。



转载地址:http://blog.youkuaiyun.com/chuangxin/article/details/6022525

内容概要:本文深入探讨了Kotlin语言在函数式编程和跨平台开发方面的特性和优势,结合详细的代码案例,展示了Kotlin的核心技巧和应用场景。文章首先介绍了高阶函数和Lambda表达式的使用,解释了它们如何简化集合操作和回调函数处理。接着,详细讲解了Kotlin Multiplatform(KMP)的实现方式,包括共享模块的创建和平台特定模块的配置,展示了如何通过共享业务逻辑代码提高开发效率。最后,文章总结了Kotlin在Android开发、跨平台移动开发、后端开发和Web开发中的应用场景,并展望了其未来发展趋势,指出Kotlin将继续在函数式编程和跨平台开发领域不断完善和发展。; 适合人群:对函数式编程和跨平台开发感兴趣的开发者,尤其是有一定编程基础的Kotlin初学者和中级开发者。; 使用场景及目标:①理解Kotlin中高阶函数和Lambda表达式的使用方法及其在实际开发中的应用场景;②掌握Kotlin Multiplatform的实现方式,能够在多个平台上共享业务逻辑代码,提高开发效率;③了解Kotlin在不同开发领域的应用场景,为选择合适的技术栈提供参考。; 其他说明:本文不仅提供了理论知识,还结合了大量代码案例,帮助读者更好地理解和实践Kotlin的函数式编程特性和跨平台开发能力。建议读者在学习过程中动手实践代码案例,以加深理解和掌握。
内容概要:本文深入探讨了利用历史速度命令(HVC)增强仿射编队机动控制性能的方法。论文提出了HVC在仿射编队控制中的潜在价值,通过全面评估HVC对系统的影响,提出了易于测试的稳定性条件,并给出了延迟参数与跟踪误差关系的显式不等式。研究为两轮差动机器人(TWDRs)群提供了系统的协调编队机动控制方案,并通过9台TWDRs的仿真和实验验证了稳定性和综合性能改进。此外,文中还提供了详细的Python代码实现,涵盖仿射编队控制类、HVC增强、稳定性条件检查以及仿真实验。代码不仅实现了论文的核心思想,还扩展了邻居历史信息利用、动态拓扑优化和自适应控制等性能提升策略,更全面地反映了群体智能协作和性能优化思想。 适用人群:具备一定编程基础,对群体智能、机器人编队控制、时滞系统稳定性分析感兴趣的科研人员和工程师。 使用场景及目标:①理解HVC在仿射编队控制中的应用及其对系统性能的提升;②掌握仿射编队控制的具体实现方法,包括控制器设计、稳定性分析和仿真实验;③学习如何通过引入历史信息(如HVC)来优化群体智能系统的性能;④探索中性型时滞系统的稳定性条件及其在实际系统中的应用。 其他说明:此资源不仅提供了理论分析,还包括完整的Python代码实现,帮助读者从理论到实践全面掌握仿射编队控制技术。代码结构清晰,涵盖了从初始化配置、控制律设计到性能评估的各个环节,并提供了丰富的可视化工具,便于理解和分析系统性能。通过阅读和实践,读者可以深入了解HVC增强仿射编队控制的工作原理及其实际应用效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值