BlazeDS中有多个频道

时间:2012-03-21 13:00:14

标签: flex blazeds

我正在尝试设置一个场景,其中Flex应用程序可以使用在两个实现BlazeDS的不同Web应用程序中编写的资源。

我最初尝试通过specifying a channel set in my mxml code执行此操作,然后将其设置为mxml中服务的通道集。但是,虽然这很有效,但我遇到了重复的会话错误。

one of the answers to my question linked to above中建议我可以/应该看到设置具有不同端点的频道。我想这意味着Flex应用程序只会在看到它时连接到一个服务,但该服务实际上也会从另一个位置提供此服务。

我尝试在services-config.xml中执行以下操作:

        <channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

        <channel-definition id="my-amf2" class="mx.messaging.channels.AMFChannel">
            <endpoint url="http://localhost:7001/dataservice1/messagebroker/amf" class="flex.messaging.endpoints.AMFEndpoint"/>
        </channel-definition>

但是在尝试启动我的服务器时,我的weblogic控制台中出现以下错误。

  

无法注册端点'my-amf',因为它的URL,   '/ messagebroker / amf'已被端点'my-amf2'

使用

  

“MessageBrokerServlet”无法在Web上启动时预加载   应用程序:“/ dataservice2”。   flex.messaging.config.ConfigurationException:无法注册   端点'my-amf',因为它的URL'/ messagebroker / amf'已经存在   由端点'my-amf2'

使用

  

无法将应用程序的激活状态设置为true   '_appsdir_DataService2_dir'。 weblogic.application.ModuleException:   [HTTP:101216] Servlet:“MessageBrokerServlet”无法预加载   在Web应用程序中启动:“/ dataservice2”。

我猜这是因为你只能有一个mx.messaging.channels.AMFChannel类通道。这是对的吗?

总的来说,我遇到的任何问题都有办法解决吗?我愿意接受不同的解决方案。

我用Google搜索并阅读了几个小时,但却找不到任何相关信息。

我们希望拥有一个在所有应用程序和特定于该应用程序的特定服务的应用程序特定服务之间共享的通用功能服务。

2 个答案:

答案 0 :(得分:1)

我将总结一下我们一直在讨论的内容,以便其他读者可能受益。

让我们仔细看看错误信息:

  

无法注册端点'my-amf',因为它的URL,   '/ messagebroker / amf'已被端点'my-amf2'

使用

它说'/ messagebroker / amf'并且在此之前没有提到URL的部分,即具有端口号的部分。由此我们可以得出BlazeDS在确定两个端点是否相同时忽略了第一部分。因此,即使http://localhost:7001/dataservice1/messagebroker/amfhttp://localhost:7002/dataservice2/messagebroker/amf指向不同的实例,它们也会被视为相同。

快速修复

此问题的一个简单修复方法是在最后一个正斜杠后重命名第二个端点。例如http://localhost:7001/dataservice1/messagebroker/amf2应该已经成功了。我不认为还有什么需要担心的,因为MessageBroker servlet在最后一个斜杠(/messagebroker/*)之后有一个带通配符的映射,它会将任何格式化的地址路由到正确的servlet。

但为什么?

也许你应该重新考虑为什么要这样做。 BlazeDS仅检查最后一部分的原因是开发人员可能根本没有想到有人实际上会尝试将端点指向另一个实例。此外,在您的设置中,此其他实例已具有相同的通道定义。您可以简单地连接到该通道,因此不需要从第一个实例进行此路由。我不知道你想要达到什么目标,所以我可以告诉你的是,你可能是从错误的角度接近它。

答案 1 :(得分:0)

有点偏离主题,但您考虑使用GraniteDS吗?通过支持WebLogic的异步servlet,它可以为您提供更好的实时消息传递性能/可伸缩性(请参阅herehere)。连接到两个不同的Web应用程序也不应该是一个问题,因为两个消息传递上下文(通道定义等)将保存在单独的servlet上下文中。