【问题标题】:Tomcat Memcached dependencies bundled with WAR与 WAR 捆绑在一起的 Tomcat Memcached 依赖项
【发布时间】:2018-12-21 01:56:21
【问题描述】:

我目前正在使用memcached-tomcat-session-manager 和 Tomcat7 进行会话存储。

这是使用$CATALINA_HOME/lib$CATALINA_HOME/conf/context.xml 中的各种memcached / transcoder / serializer JAR 以<Manager> ... 条目以规定的方式设置的,并且工作正常。

出现了一种情况,我想在我的 webapp 和(我的修改版本)memcached-session-manager 之间共享一些类的 static 属性。我相信在当前设置下,它们位于单独的类加载器中,因此无法在类之间共享静态资源。

这导致我将所有依赖项与/WEB_INF/lib 捆绑在一起,并将<Manager ... 定义移动到/META-INF/context.xml。这不起作用,Tomcat 报告:

portal_1     | 2018-12-21 01:26:27,291 [Portal] SEVERE {localhost-startStop-1}   Digester Begin event threw exception                                                                                               
portal_1     | java.lang.ClassNotFoundException: de.javakaffee.web.msm.MemcachedBackupSessionManager                                                                                                                
portal_1     |  at java.net.URLClassLoader.findClass(URLClassLoader.java:381)                                                                                                                                       
portal_1     |  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)                                                                                                                                            
portal_1     |  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)                                                                                                                                            
portal_1     |  at org.apache.tomcat.util.digester.ObjectCreateRule.begin(ObjectCreateRule.java:144)                                                                                                                
portal_1     |  at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1303)                                                                                                                        
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)                                                                                            
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:182)                                                                            
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanStartElement(XMLDocumentFragmentScannerImpl.java:1339)                                                                
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2784)                                                      
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)                                                                                             
portal_1     |  at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)                                                                     
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)                                                                                                 
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)                                                                                                 
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)                                                                                                                   
portal_1     |  at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)                                                                                                  
portal_1     |  at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)                                                                                                
portal_1     |  at org.apache.tomcat.util.digester.Digester.parse(Digester.java:1576)                                                                                                                               
portal_1     |  at org.apache.catalina.startup.ContextConfig.processContextConfig(ContextConfig.java:644)                                                                                                           
portal_1     |  at org.apache.catalina.startup.ContextConfig.contextConfig(ContextConfig.java:606)                                                                                                                  
portal_1     |  at org.apache.catalina.startup.ContextConfig.init(ContextConfig.java:842)                                                                                                                           
portal_1     |  at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:399)                                                                                                                 
portal_1     |  at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)                                                                                                          
portal_1     |  at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)                                                                                                                 
portal_1     |  at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:388)                                                                                                                  
portal_1     |  at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:103)                                                                                                                              
portal_1     |  at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:135)
portal_1     |  at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1018)
portal_1     |  at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:994)
portal_1     |  at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652)
portal_1     |  at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1127)
portal_1     |  at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:2021)
portal_1     |  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
portal_1     |  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
portal_1     |  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
portal_1     |  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
portal_1     |  at java.lang.Thread.run(Thread.java:748)

我确信依赖项捆绑在 WAR 中。在阅读了 Tomcat 7 文档之后,我不清楚我正在做的事情是否可行 - 在 WARs context.xml 中定义了不在 $CATALINA_HOME/lib 中的类,例如尚未创建应用程序类加载器。

【问题讨论】:

    标签: tomcat7 memcached


    【解决方案1】:

    memcached-session-manager (msm) jar 必须驻留在 $CATALINA_HOME/lib 中,因为它们使用的是 tomcat 内部类(这在 webapp 中是不可能的)。更具体地说,这些 jar 是 memcached-session-manager.jarmemcached-session-manager-tc7.jarspymemcached.jar

    唯一必须放在/WEB_INF/lib 中的与msm 相关的jar 是序列化相关的jar,例如msm-kryo-serializer(通常在您的maven/gradle/xyz 构建中定义为依赖项),因为它们必须能够访问特定于应用程序的类.

    另见相关msm documentation

    关于在 msm 和应用程序之间共享信息的目标:由于 msm jar 必须驻留在 $CATALINA_HOME/lib 中,因此从概念上讲,不可能将应用程序代码与 msm 代码静态“链接”(msm 序列化程序相关代码除外)。这只能通过额外的间接实现:在 msm 中定义一些接口,应用程序提供一个实现,然后 msm 通过反射加载该接口。这就是序列化程序与 msm 挂钩的方式,请参见 the TranscoderFactory interface(从 $CATALINA_HOME/lib 加载)和 KryoTranscoderFactory implementation(从 /WEB_INF/lib 加载)。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2014-11-30
      相关资源
      最近更新 更多