LiferayはAPIをサポートし、API自体やLiferayのソフトウェアの他の部分と関係するあらゆる問題を解決し、あらゆる質問に回答します。 カスタム開発に関する問題や質問は、当社のグローバルサービスチームまたはそれらのカスタム化の開発者が対応することがあります。
多くのプラグインは、クラスタ上で通信できる必要があります。 クラスタ内のノードは通常、使用可能な単一のデータベースを共有しますが、他のノードのメモリ内キャッシュを更新するためにメッセージを送信したり、ユーザーのアクションに応じてすべてのノードに何らかのアクションを指示したりすることが望ましい場合があります。
この記事では、クラスタ間でデータを転送する3つの方法に関する基本情報を記録します:
解像度
1. MultVMPoolUtil
例
MultiVMPoolUtilは、ポータルキャッシュの作成とフェッチに使用できます。これらのキャッシュは基本的にマップであり、クラスタ全体で共有したり、1つのノードで使用したりすることができます。 ポータル・キャッシュを作成/取得するには、単に呼び出すだけです:
PortalCache portalCache = MultiVMPoolUtil.getCache("MarkAppCache");
portalCache.put("First key", "First Value");
*ポータルのキャッシュは、マップのように使うことができます(キーと値はStringである必要はなく、この例で使っているものだけです):
これらの値は後で取得することができますが、さらに良いことに、ポータルキャッシュのリスナーを次のように指定することができます:
CacheListener<String, String> myCacheListener = new MyCacheListenerImpl<String, String>();
portalCache.registerCacheListener(myCacheListener);
設定
これらのキャッシュは、クラスタ内の異なるノード間でデータを送信できるように構成することができます。
<cache eternal="false" maxElementsInMemory="100" name="TestCache" overflowToDisk="false" timeToIdleSeconds="600" > <cacheEventListenerFactory class="com.liferay.portal.cache.ehcache.LiferayCacheEventListenerFactory" properties="replicatePuts=true,replicatePutsViaCopy=true,replicateUpdatesViaCopy=true" propertySeparator="," /> <bootstrapCacheLoaderFactory class="com.liferay.portal.cache.ehcache.LiferayBootstrapCacheLoaderFactory" /> </cache>
これは、 ehcache.multi.vm.config.location
プロパティで示されるファイル内にあることになります。
Tomcatのこの場所のルートは、tomcat-home/webapps/ROOT/WEB-INF/classesです。
重要なのは、パフォーマンス上の理由から、プロパティreplicatePutsViaCopyとreplicateUpdatesViaCopyのデフォルトがfalseであることです。 キャッシュの最大サイズはmaxElementsInMemoryで示されます。 この上限値に達すると、登録されたキャッシュリスナーは退去に対応することができます。
サイドノート
ehcache.multi.vm.config.location
を変更することは、クラスタ全体に伝播するキャッシュを設定するだけではなく、Liferayのすべてのキャッシュを直接変更します。これはパフォーマンスチューニングに不可欠なので、必ずデフォルトファイルから要素を引き継いで、特定の環境用に調整します(通常これはキャッシュサイズの増加/減少を含みます)。
2. クラスター化できるアノテーション
LiferayのClusterableアノテーションは実装が簡単で、ClusterableAdviceで使用されています:
@Clusterable (acceptor = MyClusterInvokeAcceptor.class, onMaster = true)
public void myMethod(Args[] args)
クラスターアクセプターはClusterInvokeAcceptorを実装することができ、アノテーションされたメソッドがノード上で起動されるかどうかを決定する1つのメソッドのみを持ちます。 onMasterをtrueに設定すると、マスターノードにのみこのメソッドが呼び出されるようになります。
このアノテーションはサービスクラスで使用することができ、複数のノードで操作を実行する必要がある場合に便利です。
3. クラスターエグゼキュータユーティリティ
ClusterExecuterUtilは、より細かい処理を行う必要がある場合や、サービスの外でこれを行う必要がある場合に使用することができます。 これはアノテーションほど便利ではなく、静的なメソッドしか呼び出せず、すべての引数はシリアライズ可能でなければなりません。
まず、メソッドキーを作成する必要があります:
MethodKey myMethodKey = new MethodKey(MethodClass.class, "methodName", FirstSerializableArguement.class ...);
次に、メソッドハンドラを作成します:
MethodHandler myMethodHandler = new MethodHandler(myMethodKey, myFirstArguement....);
これでクラスタリクエストを作成することができます(skipLocalパラメータを真にすると、現在のノードをスキップすることができます):
ClusterRequest clusterRequest = ClusterRequest.createMulticastRequest(methodHandler, true);
ClusterExecutorUtil.execute(clusterRequest);
これにより、サービスの外でメソッドを呼び出すことができる。