【问题标题】:Is it possible to connect a flex application to two different BlazeDS servers?是否可以将 flex 应用程序连接到两个不同的 BlazeDS 服务器?
【发布时间】:2012-03-15 19:04:53
【问题描述】:

我的问题是可以从同一个 Flex 应用程序连接到两个不同的 BlazeDS 服务器吗?我已经读过这个问题: Can a Flex client app connect to BlazeDS running on a different server? 但是,它似乎在讨论将 Flex 客户端连接到不同服务器上的 BlazeDS 的可能性,但不一定要连接到不同服务器上的另一个 BlazeDS。

我也读过这个问题: One Flex client connecting to two webapps using BlazeDS - Detected duplicate HTTP-based FlexSessions

在我尝试过的尝试中,我得到了上面第二个问题中提到的错误: 检测到重复的基于 HTTP 的 FlexSession,通常是由于远程主机禁用了会话 cookie。必须启用会话 cookie 才能正确管理客户端连接。

是否完全不可能将一个 Flex 应用程序连接到两个启用 BlazeDS 的服务器?我们希望能够拥有一个“通用功能”BlazeDS 服务器,供许多 Flex 应用程序使用,每个应用程序都有自己的本地 BlazeDS 服务器来实现自己的功能。

//编辑 我目前的做法:

在我的 mxml 文件中,我定义了一个这样的通道集:

        <mx:ChannelSet id="dataService1Channel">
            <mx:channels>
                <mx:AMFChannel id="dataService1AmfChannel"
                               channelFault="dataService1Fault(event)"
                               url="http://localhost:7001/dataservice1/messagebroker/amf"/>
            </mx:channels>
        </mx:ChannelSet>

然后我在以下配置的数据服务中使用此通道集(当我使用 FlashBuilder 的“连接到 BlazeDS”功能时自动配置)

      <dataservice1:DataService1Service id="dataService1Service"
                                          fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                                          showBusyCursor="true"
                                          channelSet="{dataService1Channel}"/>

其他数据服务的定义如下:

      <dataservice2:DataService2Service id="dataService2Service"
                                          fault="Alert.show(event.fault.faultString + '\n' + event.fault.faultDetail)"
                                          showBusyCursor="true"/>

调用有效,我可以获取数据,但我收到了我在 Flex 应用程序中以警报形式提到的警告。如果我能抑制那个警告,我会很高兴。

【问题讨论】:

    标签: apache-flex blazeds


    【解决方案1】:

    正在将一个 Flex 应用程序连接到两个启用 BlazeDS 的服务器 完全不可能?

    是的!假设正确的 crossdomain.xml 文件已就位,我认为您没有理由不能这样做。

    [注意,从这里开始,我假设您将 BlazeDS 与 RemoteObjects/AMF 一起使用]

    为此;您很可能会在 services-config 文件中创建不同的端点。默认端点 [至少对于 ColdFusion 包含的服务配置] 自动指向提供 SWF 的服务器。没有理由不能创建自己的端点,即使是在同一个 services-config 文件中的不同端点。如果您认为有必要,您也可以在运行时定义运行点。

    我不确定您为什么会收到与会话相关的错误;除非您的服务器端代码以某种方式需要会话。

    【讨论】:

    • 感谢您的回复。我不是 100% 确定我是否跟随你。据我所知,我正在使用 RemoteObjects/AMF。你提到有不同的端点。我已经在我的问题中详细说明了我目前的做法。您的新解决方案听起来很有趣,并且可能更适合开发(因此数据服务有望用于测试 Flash Builder 的 GUI)。您建议在 services-config.xml 文件中设置一个新端点。我尝试这样做(通过定义新的通道定义),但在尝试运行服务器时收到奇怪的错误消息。
    • 它抱怨“无法注册端点 'my-polling-amf',因为它的 URL '/messagebroker/amf' 已被端点 'my-polling-amf2' 使用”我也试过了在我的频道定义中定义新的端点,但不幸的是这没有帮助(没有错误消息,但没有明显的服务访问权限)顺便说一句,我使用 Java 作为后端服务器语言。
    【解决方案2】:

    我在使用 SINGLE flex 客户端 (swf) 连接两个 BlazeDS 服务器时遇到了同样的问题。事实上,正如 flex 文档所说:

    “每个用 MXML 或 ActionScript 编写的 Flex 应用程序最终都会编译成一个 SWF 文件。当 SWF 文件连接到 BlazeDS 服务器时,会创建一个 flex.messaging.client.FlexClient 对象来表示该 SWF 文件在服务器。SWF 文件和 FlexClient 实例具有一对一的映射关系。在此映射中,每个 FlexClient 实例都有一个名为 id 的唯一标识符,由 BlazeDS 服务器生成。还创建了一个 ActionScript 单例类 mx.messaging.FlexClient供 Flex 应用程序访问其唯一的 FlexClient id。”

    例如,您有两个 blazeDS 服务器。 1) 远程 2)本地和单个 FlexApp(swf)“MyClient”。

    步骤 1. MyClient 连接到 REMOTE blazeDS 服务器。这样就生成了一个唯一的 id。

    第 2 步。现在 MyClient 连接到 LOCAL blazeDS 服务器。将使用在第 1 步中生成的相同 id,因为只能为单个 FlexApp(swf) 生成单个 uniqe Id。

    第 3 步。现在 MyClient 将重新连接到 REMOTE blazeDS 服务器。请记住,每次 FlexApp(swf) 连接到 blazeDS 服务器时,都会生成一个唯一的 FlexClient 以及唯一的 ID。所以,现在到这第 3 步,我们已经有了第 1 步生成的 id。所以,肯定会抛出 Duplicate Session 异常。

    解决方案: 我在我的应用程序中找到并应用了一种解决方法。有用。 每次 FlexApp(swf) 切换 blazeDS 服务器时,生成的 id=null。

    FlexClient.getInstance().id=null;
    

    在上面引用的示例中,在第 1 步之后使 id=null。现在,当它连接到 LOCAL blazeDS 时,它不会使用第 1 步生成的 id。相反,它将在 LOCAL 工作时创建一个新的唯一 id blazeDS 模式。

    当您从 LOCAL 模式切换到 REMOTE 模式(第 3 步)时,再次通过此代码片段使 id=null。所以,现在当 FlexApp(swf) 连接到 REMOTE blazeDS 时,会生成一个新的唯一 Id,不会出现 Duplicate Session 异常。

    感谢和问候, 阿努帕姆 G.

    【讨论】:

    • 看起来它应该可以工作,但我现在无法测试它。但遗憾的是没有其他方法可以做到这一点。切换服务器时忘记编写那行代码会导致显示错误消息。为努力+1!好帖子!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多