2015-06-25 64 views
3

我有一個Liferay應用程序中的幾個Singleton類,它們擁有幾個配置參數和一個帶實例的ServiceLocator,以便我需要使用WebServices。要在多個portlet之間共享的單例類

我已經把這些類放在一個聲明爲所有portlet的依賴項的jar中。

問題是,我在這些單例類中放了一些用於初始化的日誌行,並且當我部署我的portlet時,我可以多次看到這些行,每次portlet一次,因爲每個portlet都有它自己的類上下文。

對於AppConfig類,它可能不是什麼大不了的事,但是我的ServiceLocator確實擁有一大堆佔用大量內存的引用。

有沒有什麼方法可以將這些單例引用放入我的Liferay Portal中的某種共享上下文中?

+0

每個Portlet是否都有自己的類加載器實例? – Alexander

+0

是的,他們在不同的戰爭 – MichelReap

+2

這就是問題所在!通常,當我必須實現這樣的事情時,我必須將包含Singleton類的JAR放入_common_類加載器庫(在Tomcat中:「/common/lib」或類似的東西),而不是將其包裝到每個WAR中。問題是你也必須把所有的依賴庫放到這個通用的lib目錄中。雖然不知道如何在Liferay中做到這一點。對於tomcat看到這個線程:http://stackoverflow.com/questions/267953/does-tomcat-load-the-same-library-file-into-memory-twice-if-they-are-in-two-web – Alexander

回答

2

亞歷山大的回答給出了一般答案,無論Liferay是否存在都是真實的。

Liferay(如你所說)增加了另一個選項:ServiceBuilder。您最終將只包含在一個Web應用程序中的實際實例中,並且您將擁有一個可以與每個相關應用程序一起分發的接口jar。通過這種方式,您可以更輕鬆地更新實現:將新的和更新的Web應用程序熱部署到應用程序服務器很容易 - 更新生活在全局類路徑中的代碼更加困難。

但是,全局類路徑(亞歷山大的答案)帶給您的是直接的成功,而ServiceBuilder帶有自己的學習曲線並引入了一些更多的依賴關係。我不介意這些依賴關係,但你的里程可能會有所不同。自己決定

3

問題是每個Portlet運行在它自己的WAR文件中,並且aech war文件有它自己的類加載器。

通常,當我必須達到這樣的要求時,我必須將Singleton classen放入JAR文件中,並將此JAR文件放在公共類加載器庫中,而不是將其打包到每個WAR中。 (在Tomcat中:<tomcatHome>/common/lib或類似的東西)

然後,你還必須把所有的依賴庫放到那個通用的lib目錄中。不過,不知道如何在Liferay中做到這一點。對於tomcat看到這個線程:stackoverflow.com/questions/267953/和這個文檔:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html。取決於Servlet容器。

+0

感謝您的轉換。 Upvoted –

0

使用maven portlet,您可以製作一個常見的Spring組件,並在每個portlet的pom中導入。 另一個解決方案是使用服務構建器。 Spring MVC portlet將是這方面最受推薦的。