好的,我想我找到了解决所有这些问题的方法。希望它可以帮助其他人。
首先,您需要升级 ehCache 并将 terracotta jar 添加到您的类路径中,以便能够使用 terracotta。这意味着您需要删除与 Railo 捆绑的 ehcache.jar,因为这是一个旧版本,不适用于 terracotta。罐子是:
- ehcache-core-##.##.##.jar (##.##.## 是版本)
- ehcache-兵马俑-##.##.##.jar
- slf4j-api-##.##.##.jar
- slf4j-jdk14-##.##.##.jar
- slf4j-log4j12-##.##.##.jar
- terracotta-toolkit-1.3-runtime-##.##.##.jar
- 从 Railo 库中删除“ehcache.jar”,否则 Terracotta 将无法加载。
接下来,您需要将 <terracottaConfig url="localhost:9510" /> 和 <terracotta clustered="true" /> 行添加到您的 ehcache.xml,这需要在您的类路径中。这在 Terracotta 网站上有很好的记录。
ehCache 使用 ContextClassLoader() 加载所有类,它失败了,它回退到 ClassLoaderUtil。Railo contextClassLoader() 默认设置为“org.apache.catalina.loader.WebappClassLoader”(Tomcat ClassLoader)。此类加载器无法正确找到 railo 对象,因此您需要将其更改为“railo.loader.classloader.RailoClassLoader”。由于这是一个每个线程(即每个请求)上下文类加载器,因此您需要在 onRequestStart() 方法的开头调用以下命令:
<cfset getPageContext().getThread().currentThread().setContextClassLoader( getPageContext().getClass().getClassLoader() ) />
这应该修复 ehcache 和休眠。接下来的会议,使用带有 Terracotta 的 tomcat 阀门似乎是一个问题,因为该阀门似乎在 Railo 处理请求之前被调用。因此使用“org.apache.catalina.loader.WebappClassLoader”并抛出类未找到异常。一种解决方法是将会话本身存储在 ehcache 和 Terracotta 中,并将其分布在整个集群中。问题在于 Terracotta 中存储的对象需要可序列化,而 J2EE 会话基于“org.apache.catalina.connector.SessionFacade”,不可序列化。因此,为了解决这个限制,我只是通过使用 structCopy(session) 命令将 J2EE 会话转换为可序列化的简单结构,并将生成的结构放入 ehcache 中。
那应该可以让您使用 Terracotta 和 Railo。