2

Railo (Open Source ColdFusion Engine - www.getrailo.org) で Terracotta (Web セッション + ehcache + hibernate) をセットアップしようとしています。Terracotta サーバーを起動し、アプリケーション サーバーを Terracotta サーバーに接続し、3 つの要素 (セッション、ehcache、休止状態) をすべて完全に機能させてアプリケーションを正常に実行できます。

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

参考までに、さまざまな Java スタックトレースを添付しました。アプリケーションサーバーの再起動後にのみこれが発生する理由と、それを修正するにはどうすればよいですか?

敬具、

フィリップ

-

Java スタック トレース:

railo.runtime.type.scope.JSession

railo.runtime.type.StructImpl

4

1 に答える 1

2

OK、これらすべての問題の回避策を見つけたと思います。うまくいけば、それは他の誰かを助けるかもしれません。

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

  • 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 Web サイトで十分に文書化されています。

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 と休止状態が修正されるはずです。次のセッションでは、Railo がリクエストを処理する前にバルブが呼び出されるように見えるため、Terracotta で tomcat バルブを使用すると問題が発生するようです。したがって、「org.apache.catalina.loader.WebappClassLoader」が使用され、class not found 例外がスローされます。これを回避するには、セッション自体を ehcache と Terracotta に保存し、クラスター全体に分散します。問題は、Terracotta に格納されたオブジェクトがシリアライズ可能である必要があり、J2EE セッションがシリアライズ不可能な「org.apache.catalina.connector.SessionFacade」に基づいていることです。したがって、この制限を回避するために、structCopy(session) コマンドを使用して、J2EE セッションをシリアル化可能な単純な構造体に変換し、結果の構造体を ehcache に配置しました。

これで、Terracotta と Railo を使用できるようになるはずです。

于 2011-08-24T18:32:29.897 に答える