我正在尝试设置一个场景,在这个场景中,Flex应用程序将能够使用在实现BlazeDS的两个不同web应用程序中编写的资源。
我最初尝试在mxml代码中指定一个通道集,然后将其设置为mxml中服务的通道集。然而,尽管这样做有效,我还是收到了重复的会话错误。
在上面链接的我的问题的一个答案中,有人建议我可以/应该了解如何设置具有不同端点的通道。我想这意味着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 amf",因为它的URL,"/messagebroker/amf",已被端点"my-amf2"使用
它提到了"/messagebroker/amf",并没有提到在此之前的URL部分,即带有端口号的部分。由此我们可以得出,当BlazeDS确定两个端点是否相同时,它只是忽略了第一部分。像这样的http://localhost:7001/dataservice1/messagebroker/amf和http://localhost:7002/dataservice2/messagebroker/amf即使它们指向不同的实例,也会被认为是相同的。
快速修复
解决这个问题的一个简单方法是简单地重命名最后一个正斜杠之后的第二个端点。例如http://localhost:7001/dataservice1/messagebroker/amf2应该已经成功了。我认为您不需要担心其他任何事情,因为MessageBrokerservlet在最后一个斜杠(/messagebroker/*
)之后有一个带有通配符的映射,它将把这样格式化的任何地址路由到正确的servlet。
但为什么
也许你应该重新考虑你为什么要这么做。BlazeDS只检查最后一部分的原因是,开发人员可能根本没有想到有人会试图将端点指向不同的实例。此外,在您的设置中,这个其他实例已经具有相同的通道定义。您可以简单地连接到该通道,因此不需要从第一个实例进行此路由。我不知道你想实现什么,所以我只能告诉你,你可能从错误的角度来看待它。
有点离题,但您是否考虑过使用GraniteDS?通过支持WebLogic的异步servlet,它将为您提供更好的实时消息传递性能/可扩展性(请参阅此处和此处)。连接到两个不同的web应用程序也应该不是问题,因为这两个消息传递上下文(通道定义等)将保存在单独的servlet上下文中。