2012-03-21 33 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上下文中。