【问题标题】:More than one channel in BlazeDSBlazeDS 中的多个频道
【发布时间】:2012-03-21 13:00:14
【问题描述】:

我正在尝试设置一个场景,让 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 类的频道。这是正确的吗?

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

我已经用谷歌搜索和阅读了几个小时,但找不到任何关于此的信息。

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

【问题讨论】:

  • 我认为,正如错误消息所述,您应该简单地为 my-amf2 提供不同的端点 URL。当然,您必须在 web.xml 中设置 servlet。
  • 请原谅我的无知:据我所知,URL 已经不同,因为它具有不同的端口。我不确定该怎么做。你能详细说明一下吗?将不胜感激。
  • 你确定它不一样吗?从我可以看到{server.port} 令牌很可能被相同的端口替换。您可以使用 FireBug 或 Charles 来准确监控它尝试连接的地址。
  • 我 100% 确定。正在启动 dataservice2 的服务器位于端口 7002 上,而另一个服务 (dataservice1) 位于端口 7001 上。我无法通过 FireBug 进行检查,因为服务器甚至无法正常启动。跨度>
  • 我不这么认为:已经有不同的通道具有不同的端点(my-amf、my-polling-amf、my-streaming-amf、...)。但是我一直在重新阅读该错误消息,似乎 BlazeDS 只是使用“/messagebroker/amf”来验证端点是否已经注册。在这种情况下,您可以通过更改 servlet 名称(例如更改为“/messagebroker/amf2”)或创建 .为此,您只需更改端点 url,因为我认为它会自动映射到 MessageBrokerServlet。 '/messagebroker/' 部分是必需的。

标签: apache-flex blazeds


【解决方案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 只检查最后一部分的原因是开发人员可能根本没有想到有人实际上会尝试将端点指向不同的实例。此外,在您的设置中,这个其他实例已经具有相同的通道定义。您可以简单地连接到该通道,因此不需要从第一个实例开始进行此路由。我不知道你想要达到什么目的,所以我只能告诉你,你可能是从错误的角度接近它。

【讨论】:

  • 对您的答案投了赞成票,因为它是迄今为止讨论的所有内容的出色总结。从那以后,我决定尝试按照您的建议从不同的角度来处理它,方法是使用跨不同项目使用的通用代码库(这有其优点和缺点)。
【解决方案2】:

有点跑题了,但你考虑过使用GraniteDS吗?它支持 WebLogic 的异步 servlet(参见 herehere),将为您提供更好的实时消息传递性能/可扩展性。连接到两个不同的 web 应用程序也不会有问题,因为两个消息传递上下文(通道定义等)将保存在单独的 servlet 上下文中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2013-05-01
    • 1970-01-01
    相关资源
    最近更新 更多