2012-03-21 29 views
2

我试图设置一个场景,其中一个Flex应用程序将能够使用两个不同的Web应用程序实现BlazeDS中编写的资源。BlazeDS中的多个通道

我最初试图通过specifying a channel set in my mxml code来完成,然后将其设置为mxml中服务的通道集。但是,虽然这工作,我得到重复会话错误。

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

我试着做我的服务-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控制台以下错误。

无法注册端点 '我-AMF',因为它的URL, '/ messagebroker/AMF',已经由端点 '我-amf2'

在Web 应用程序“/ dataservice2”中启动时,“MessageBrokerServlet”未能预加载。 flex.messaging.config.ConfigurationException:无法注册 端点 '我-AMF',因为它的URL, '/ messagebroker/AMF',已经是 通过终点 '我-amf2'

使用

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

我猜这是因为你只能有一个类mx.messaging.channels.AMFChannel的通道。它是否正确?

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

我已经google和读了几个小时,但没有找到任何关于此。

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

+0

我想,正如错误消息所述,您应该简单地为my-amf2提供一个不同的端点URL。当然,你必须在web.xml中设置servlet。 – RIAstar 2012-03-21 13:05:36

+0

你不得不原谅我的无知:据我所知,这个URL已经不同了,因为它有一个不同的端口。我不确定该怎么做。你能否详细说明一下?这将非常感激。 – 2012-03-21 13:20:47

+0

你确定它不同吗?从我所看到的'{server.port}'令牌可以用相同的端口替换。您可以使用FireBug或[Charles](http://www.charlesproxy.com/)来准确监控它尝试连接的地址。 – RIAstar 2012-03-21 14:18:41

回答

1

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

让我们在错误消息,仔细一看:

无法注册端点 '我-AMF',因为它的URL, '/ messagebroker/AMF',已经由端点 '我-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只检查最后一部分的原因是,开发人员可能根本没有想到有人会真正尝试将端点指向不同的实例。而且在你的设置中,这个另外的实例已经有了相同的通道定义。您可以简单地连接到该通道,因此不需要从第一个实例进行此路由。我不知道你想达到什么,所以我只能告诉你,你可能从错误的角度来看待它。

+0

向上投票你的答案,因为它是迄今为止所讨论的一切的一个很好的总结。从那以后,我决定从不同的角度使用一个通用的代码库(这有其优点和缺点),从另一个角度来尝试和处理它。 – 2012-03-23 11:24:00

0

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