2011-08-18 2 views
2

私は、Railo(Open Source ColdFusion Engine - www.getrailo.org)でTerracotta(Webセッション+ ehcache + hibernate)を設定しようとしています。私はTerracottaサーバーを起動し、アプリケーションサーバーをTerracottaサーバーに接続し、正常に動作する3つの要素(セッション、ehcache、および休止状態)すべてでアプリケーションを正常に実行することができます。TelocottaをRailo/ColdFusionで使用する

アプリケーションサーバーをシャットダウンして再起動すると、Terracottaサーバーに正しく接続されますが、セッションオブジェクトまたはehcacheオブジェクトのさまざまなclassNotFoundExceptionsがスローされます。

あなたの情報のためにさまざまなJavaスタックトレースを添付しました。なぜアプリケーションサーバーを再起動した後にのみこれが起こっているのか、そしてどうすれば修正できますか?

敬具、

フィリップ

-

Javaスタックトレース:

railo.runtime.type.scope.JSession

railo.runtime.type.StructImpl

+0

Javaオブジェクトを介して直接ehcacheとやり取りするか、Railo ehCacheプロバイダを使用してからcacheGetとcachePut経由で –

答えて

2

はOK、私はすべての人々に回避策を見つけたと思います手続きするミズ。うまくいけば、それは他の人を助けるかもしれない。

まず、ehCacheをアップグレードして、テラコッタで作業できるように、クラスパスにテラコッタのjarファイルを追加する必要があります。これは、Railoにバンドルされているehcache.jarを削除する必要があることを意味します。これは、Terracottaで動作しない古いバージョンであるためです。ジャーは、次のとおり

  • ehcacheをコア - ## ## ##ジャー(## ## ##バージョンである。)
  • ehcacheを、テラコッタ - ## ##。。。。。 。##
  • SLF4J-APIをジャー - ## ## ##
  • SLF4J-JDK14をジャー - 。。。## ## ##
  • SLF4J-log4j12をジャー - 。。。。## ## ### jar
  • terracotta-toolkit-1.3-runtime - ##。##。jar
  • Railoライブラリから "ehcache.jar"を削除してください。さもなければ、Terracottaはロードされません。

次は< terracottaConfig URL =は "localhost:9510" を追加する必要がありますあなたのクラスパスにする必要がありますあなたのehcache.xmlに= "true" を/ >行クラスタ化/ >と<テラコッタを。これは、テラコッタのウェブサイトによく記載されています。

ehCacheは、すべてのクラスをロードするためにContextClassLoader()を取ります。失敗すると、ClassLoaderUtilにフォールバックします。 Railo contextClassLoader()はデフォルトで "org.apache.catalina.loader.WebappClassLoader"(Tomcat ClassLoader)に設定されています。このクラスローダーは、レールオブジェクトを正しく見つけることができませんでしたので、 "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」に基づいていることです。したがって、この制限を回避するために、J2EEセッションをシリアライズ可能な単純な構造体にstructCopy(session)コマンドを使用して変換し、結果の構造体をehcacheに配置しました。

これは、あなたがテラコッタとレールで行くことができるはずです。

+0

偉大な研究をしてください。 Railoは時には本当の痛みになることがあります。 – Nic

関連する問題