2011-08-18 65 views
2

我試圖用Railo(開源的ColdFusion引擎 - www.getrailo.org)設置兵馬俑(Web Sessions + ehcache + hibernate)。我能夠啓動Terracotta服務器,將應用程序服務器連接到Terracotta服務器,並通過三個元素(會話,ehcache和hibernate)正常運行應用程序,使其功能完全正常。使用兵馬俑與Railo/ColdFusion

問題是如果我關閉了應用程序服務器,並重新啓動它,它將正確連接到Terracotta服務器,但它會開始在會話對象或ehcache對象上拋出各種classNotFoundExceptions。

我附加了各種java stacktrace以供您參考。任何想法爲什麼只有在應用程序服務器重新啓動後纔會發生這種情況,我該如何解決它?

親切的問候,

菲利普

-

Java堆棧跟蹤:

railo.runtime.type.scope.JSession

railo.runtime.type.StructImpl

+0

如何直接通過java對象與ehcache交談或使用任何Railo ehCache提供程序,然後通過cacheGet和cachePut –

回答

2

OK,我想我找到了一個解決方法,所有這些proble女士。希望它可以幫助別人。

首先,您需要升級您的ehCache,然後將陶土罐添加到您的類路徑中,以便能夠使用兵馬俑。這意味着您需要刪除與Railo捆綁在一起的ehcache.jar,因爲這是一箇舊版本,不適用於兵馬俑。這些罐子是:

  • ehcache的核心 - ## ## ##罐子(## ## ##爲版本。)
  • 的Ehcache-兵馬俑 - ## ##。。。 ##罐子
  • SLF4J的API - ## ## ##罐子
  • SLF4J-JDK14 - 。## ## ##罐子
  • SLF4J-log4j12 - 。## ##。 。#。jar。
  • terracotta-toolkit-1.3-runtime - ##。##。##。jar
  • 從Railo lib庫中刪除「ehcache.jar」,否則將無法加載Terracotta。

接下來,您需要添加< terracottaConfig URL =「本地主機:9510」/>和<赤土集羣=「真」/>行到你的ehcache.xml中,這需要在你的類路徑。這在兵馬俑網站上有很好的記錄。

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和休眠。接下來的會議中,使用帶有兵馬俑的tomcat閥似乎是一個問題,因爲閥門似乎在Railo處理請求之前調用。因此使用「org.apache.catalina.loader.WebappClassLoader」,並且引發了一個未找到類的異常。解決此問題的方法是將會話本身存儲在ehcache和Terracotta中,並將其分佈到集羣中。問題是存儲在Terracotta中的對象需要可序列化,並且J2EE會話基於不可序列化的「org.apache.catalina.connector.SessionFacade」。因此,爲了解決這個限制,我只是使用structCopy(session)命令將J2EE會話轉換爲一個可串行化的簡單結構,然後將生成的結構放入ehcache中。

這應該能夠讓你與兵馬俑和鐵路。

+0

偉大的研究。有時候,Railo可能會是一種真正的痛苦。 – Nic