我正在尝试用Railo (开源ColdFusion引擎- www.getrailo.org)来设置Terracotta (Web + ehcache + hibernate)。我能够启动Terracotta服务器,将应用服务器连接到Terracotta服务器,并使用所有三个元素(会话、ehcache和hibernate)完全正常地运行应用程序。
问题是,如果我关闭应用程序服务器,然后重新启动它,它将正确连接到Terracotta服务器,但它将开始在会话对象或ehcache对象上抛出各种classNotFoundExceptions。
我附上了各种java堆栈跟踪供您参考。您知道为什么只有在应用程序服务器重新启动后才会发生这种情况吗?我该如何修复它?
致以亲切的问候,
菲利普
-
Java堆栈跟踪:
railo.runtime.type.scope.JSession
railo.runtime.type.StructImpl
发布于 2011-08-25 02:32:30
好了,我想我找到了解决所有这些问题的办法。希望它能帮助其他人。
首先,您需要升级您的ehCache并将terracotta jars添加到您的类路径中,以便能够使用terracotta。这意味着你需要删除与Railo捆绑在一起的ehcache.jar,因为这是一个旧版本,不能与terracotta一起工作。这些jars是:
接下来,您需要将和行添加到ehcache.xml中,它需要位于您的类路径中。这在Terracotta网站上有很好的记录。
ehCache接受ContextClassLoader()来加载所有的类,如果失败了,它会退回到ClassLoaderUtil上。默认情况下,Railo ()设置为"org.apache.catalina.loader.WebappClassLoader“(ContextClassLoader ClassLoader)。这个类加载器不能正确地找到railo对象,因此您需要将其更改为"railo.loader.classloader.RailoClassLoader“。由于这是一个每个线程(即每个请求)的上下文类加载器,因此您需要在onRequestStart()方法的开始处调用以下命令:
<cfset getPageContext().getThread().currentThread().setContextClassLoader( getPageContext().getClass().getClassLoader() ) />这应该可以修复ehcache和hibernate。在接下来的会话中,使用带有Terracotta的tomcat阀门似乎是一个问题,因为似乎在Railo处理请求之前调用了这个阀门。因此,使用"org.apache.catalina.loader.WebappClassLoader“并抛出类未找到异常。一种解决方法是将会话本身存储在ehcache和Terracotta中,并将其分布在集群中。问题是存储在Terracotta中的对象需要是可序列化的,而"org.apache.catalina.connector.SessionFacade",会话基于不可序列化的Terracotta。因此,为了解决这一限制,我使用structCopy(会话)命令将J2EE会话转换为可序列化的简单结构,并将生成的结构放入ehcache中。
这应该能让你跟兵马土和拉罗一起走了。
https://stackoverflow.com/questions/7111953
复制相似问题