2011-12-20 14 views
7

私は2つ以上の独立したプレイを展開しようとしています! (1.2.4)ベースのプロジェクトを同一のJettyインスタンス に割り当てます。再生!フレームワーク、単一のJettyインスタンス、複数のプロジェクトを展開する、ライブラリを共有する

this postによると、明らかに共有libディレクトリすなわちjetty/lib/extに各PrjName.war/WEB-INF/libディレクトリから 共通のlib年代を抽出し、 それらを配置することが可能です。

私たちは、Playを使用して実装するような の小さな独立プロジェクトをたくさん持っています! RAMの使用を減らすためにすべてのlibsを共有するJettyのインスタンスは、すべて にデプロイする必要があります。同じlibを共有するいくつかのプロジェクトが全体的なメモリ占有量を削減するという私の仮定は正しいのですか?

すべてのライブラリを共有場所に配置しようとしましたが、jetty/lib/extは1つのプロジェクトでは機能しましたが、2番目のプロジェクトを展開すると が失敗し、最初のファイルが破損します。

これは、競合するEhCacheインスタンスの問題であるようです。ここで

は桟橋のログです:

... 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jetty.start.Main.invokeMain(Main.java:469) 
     at org.eclipse.jetty.start.Main.start(Main.java:612) 
     at org.eclipse.jetty.start.Main.parseCommandLine(Main.java:265) 
     at org.eclipse.jetty.start.Main.main(Main.java:79) 
Caused by: net.sf.ehcache.ObjectExistsException: Cache play already 
exists 
     at net.sf.ehcache.CacheManager.addCache(CacheManager.java:859) 
     at play.cache.EhCacheImpl.<init>(EhCacheImpl.java:32) 
     at play.cache.EhCacheImpl.newInstance(EhCacheImpl.java:41) 
     at play.cache.Cache.init(Cache.java:241) 
     at play.Play.start(Play.java:511) 
     ... 42 more 

すべてのヘルプは大歓迎です。

答えて

1

共有されたjarを使用すると、JettyはシステムのClassloaderを使用して、共有されたjarファイル内のクラスを読み込みます。そして、Play EhCacheImplは(ほぼ)シングルトンなので、開始する2番目のアプリケーションは最初のアプリケーションに影響し、逆も同様です。それはあなたが今得ている例外です:Playは、同じクラスローダー内に同じ名前の2つのキャッシュをインスタンス化しようとしています。私は、次の解決策を考えることができます:それは

  • この状況に対処できるように、独自のキャッシュ実装を使用し

    1. 修正Playframework(これはあなたの両方のアプリケーションが一緒に仕事を防ぐ唯一のものであるかどうかわからない)
    2. 各アプリケーションに共通のセットアップとレプリケート用のジャーを使用します。

    オプション3は、フレームワークを偶然する必要はなく、回帰バグについてはより安全です。メモリフットプリントについては、visualvmを使用して、メモリ消費量が大幅に異なる場合に共有jarを正当化するかどうかを検証できます。

  • 関連する問題