この記事はレガシー記事です。 Liferay製品の旧バージョンにも適用されます。 記事のメンテナンスは終了していますが、情報はまだ通用する可能性があります。
TerracottaとLiferayの連携を実現する方法について解説します。
解像度
TerracottaとLiferayを正常に連携させるためには、 LPS-31709 からのパッチが必要となります。
パッチを入手後、以下の手順に従ってください:
LIFERAY_HOME=/run/shm/6120/bundles TOMCAT_HOME=$LIFERAY_HOME/tomcat-7.0.27 TERRACOTTA_ADDRESS=127.0.0.1:9510 TERRACOTTA_HOME=$HOME/Downloads/terracotta-3.5.5
1. Liferayが使用しているEhCacheのバージョンに対応するTerracottaのバージョンを検索します。 例えば、6.1EE SP1(6.1.20)では、LiferayはEhCache 2.4.6を使用します。 そのため、EhCache 2.4.xに同梱されているTerracottaのバージョンが必要です。 Terracotta 3.5.3はEhCache 2.4.6、Terracotta 3.5.5はEhCache 2.4.8で出荷しています。
2. LiferayのWEB-INF/libフォルダにあるEhCacheとSLF4jのJARをすべて削除し、Terracottaのehcache/libフォルダに用意されているものと入れ替えます。 これをシェルスクリプトで書くと、次のようになります:
rm $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/ehcache*.jar rm $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/slf4j*.jar cp $TERRACOTTA_HOME/ehcache/lib/ehcache*.jar $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib cp $TERRACOTTA_HOME/ehcache/lib/slf4j*.jar $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib
3. セッションレプリケーションを使用しない場合(Lifreay 6.1では現在セッションレプリケーションはできませんのでご注意ください)、terracotta-toolkit JARをLiferayのWEB-INF/libフォルダにコピーします。 これをシェルスクリプトで書くと、次のようになります:
cp $TERRACOTTA_HOME/common/terracotta-toolkit*.jar $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib
4. portal-impl.jar から hibernate-terracotta.xml と liferay-multi-vm-terracotta.xml を取り出し、Liferay の WEB-INF/classes にある "myehcache" フォルダに配置します。 その後、「localhost:9510」のインスタンスを、Terracottaが動作している実際のIPアドレスとポートに置き換えます(デフォルトではポート9510で動作しているので、IPアドレスは別のサーバーにある場合のみ変更してください)。 これをシェルスクリプトで書くと、次のようになります:
unzip -qq $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/portal-impl.jar ehcache/hibernate-terracotta.xml ehcache/liferay-multi-vm-terracotta.xml -d $TOMCAT_HOME/webapps/ROOT/WEB-INF/classes mv $TOMCAT_HOME/webapps/ROOT/WEB-INF/classes/ehcache $TOMCAT_HOME/webapps/ROOT/WEB-INF/classes/myehcache sed -i "s/localhost:9510/$TERRACOTTA_ADDRESS/g" $TOMCAT_HOME/webapps/ROOT/WEB-INF/classes/myehcache/hibernate-terracotta.xml sed -i "s/localhost:9510/$TERRACOTTA_ADDRESS/g" $TOMCAT_HOME/webapps/ROOT/WEB-INF/classes/myehcache/liferay-multi-vm-terracotta.xml
5. 新しいhibernate-terracotta.xmlとliferay-multi-vm-terracotta.xmlをportal-ext.propertiesに追加します。 例えば、 $LIFERAY_HOMEの portal-ext.properties を使用する場合、シェルスクリプトは次のようになります:
echo -e "\n" >> $LIFERAY_HOME/portal-ext.properties echo "net.sf.ehcache.configurationResourceName=/myehcache/hibernate-terracotta.xml" >> $LIFERAY_HOME/portal-ext.properties echo "ehcache.multi.vm.config.location=/myehcache/liferay-multi-vm-terracotta.xml" >> $LIFERAY_HOME/portal-ext.properties
6. LiferayのWEB-INF/libフォルダにあるQuartz JARをすべて削除し、Terracottaのquartzフォルダに用意されているquartz-allとquartz-terracotta JARで置き換えます。 Terracottaの配布物には他にもQuartzのJARが含まれていますが、無視して大丈夫です。 これをシェルスクリプトで書くと、次のようになります:
rm $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib/quartz*.jar cp $TERRACOTTA_HOME/quartz/quartz-all*.jar $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib cp $TERRACOTTA_HOME/quartz/quartz-terracotta*.jar $TOMCAT_HOME/webapps/ROOT/WEB-INF/lib
7. portal-ext.propertiesを更新して、古いorg.quartz.*プロパティをすべて空白にして、jobStoreクラスをorg.terracotta.quartz.TerracottaJobStoreに設定して、新しいプロパティ「tcConfigUrl」を追加して、TerracottaがあるIPアドレスとポートにポイントします。 これをシェルスクリプトで書くと、次のようになります:
echo -e "\n" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.class=org.terracotta.quartz.TerracottaJobStore" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.tcConfigUrl=$TERRACOTTA_ADDRESS" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.dataSource=" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.isClustered=" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.misfireThreshold=" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.tablePrefix=" >> $LIFERAY_HOME/portal-ext.properties echo "org.quartz.jobStore.useProperties=" >> $LIFERAY_HOME/portal-ext.properties
8. 最後に、Terracottaによるセッションレプリケーションの有効化を検討します。 仮に、LiferayのEhCacheのバージョンを、TerracottaTomcat70xSessionValveが存在するTerracottaのバージョンで使われているものと同じものにアップグレードし、すべてのEhCacheラッパークラスを修正して、アップグレードしたEhCacheインターフェースクラスに追加した新しいメソッドをすべて適切に実装するとした場合です。 そうすると、ユーザーはTerracottaを使ったセッションレプリケーションを有効にすることができるようになります。
そのために、terracotta-toolkit JARをlib/extに追加し、terracota-session JARもlib/extに含まれていることを確認します。 その後、各WebアプリケーションのすべてのコンテキストXML(Tomcatの場合はconf/Catalina/localhostに格納)を更新し、Terracottaバルブの使用を認識できるようにします。 これをシェルスクリプトとして書くと、次のようになります:
cp $TERRACOTTA_HOME/common/terracotta-toolkit*.jar $TOMCAT_HOME/lib/ext cp $TERRACOTTA_HOME/sessions/terracotta-session*.jar $TOMCAT_HOME/lib/ext for file in $TOMCAT_HOME/conf/Catalina/localhost/*; do sed -i "s/<\/Context>/\t<Valve className=\"org.terracotta.session.TerracottaTomcat70xSessionValve\" tcConfigUrl=\"$TERRACOTTA_ADDRESS\"\/>\n<\/Context>/" $file
追加情報
この資料も役に立つかもしれません: TerracottaでLiferayをクラスタリングするにはどうすればよいですか?