2

我正在尝试使用 Railo(开源 ColdFusion 引擎 - www.getrailo.org)设置 Terracotta(Web 会话 + ehcache + hibernate)。我能够启动 Terracotta 服务器,将应用程序服务器连接到 Terracotta 服务器,并在所有三个元素(会话、ehcache 和休眠)功能齐全的情况下正常运行应用程序。

问题是如果我关闭应用程序服务器并重新启动它,它将正确连接到 Terracotta 服务器,但它会开始在会话对象或 ehcache 对象上抛出各种 classNotFoundExceptions。

我附上了各种 java stacktrace 供您参考。知道为什么只有在应用程序服务器重新启动后才会发生这种情况,我该如何解决?

亲切的问候,

菲利普

-

Java堆栈跟踪:

railo.runtime.type.scope.JSession

railo.runtime.type.StructImpl

4

1 回答 1

2

好的,我想我找到了解决所有这些问题的方法。希望它可以帮助其他人。

首先,您需要升级 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。

于 2011-08-24T18:32:29.897 回答