我正在尝试部署两个或更多独立播放! (1.2.4)基于项目 相同的Jetty实例。
根据this post,显然有可能提取出来
每个PrjName.war/WEB-INF/lib
目录和位置的公共库
它们进入共享的lib目录,即jetty/lib/ext
。
我们会有大量较小的独立项目 喜欢用Play实现!但都需要部署在同一个地方 Jetty实例共享所有库以减少RAM使用。我的假设是正确的,共享相同lib的几个项目会减少整体内存占用量吗?
我尝试将所有lib放在共享位置,即jetty/lib/ext
适用于单个项目,但部署第二个项目失败
打破了第一个。
似乎是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
非常感谢任何帮助。
答案 0 :(得分:1)
当您使用共享jar时,Jetty将使用系统的Classloader来加载共享jar中的类。并且,由于Play EhCacheImpl(几乎)是单身,因此第二个启动的应用程序将影响第一个,反之亦然。这是您现在获得的例外:Play正在尝试使用相同的名称在同一个类加载器中实例化两个缓存。我可以考虑以下解决方案:
选项3对我来说听起来更好,因为你没有机会使用框架,而且对于回归错误它也更安全。关于内存占用,您可以使用visualvm来验证内存消耗是否明显不同以证明共享jar的合理性。