JMS イベント・リスナー

JMSObjectGridEventListener は、クライアント・サイド・ニア・キャッシュの無効化およびピアツーピア・レプリカ生成メカニズムをサポートするように設計されています。 これは、ObjectGridEventListener インターフェースの Java Message Service (JMS) 実装です。

クライアント無効化メカニズムは、クライアントのニア・キャッシュ・データがサーバーまたは他のクライアントと同期するように、分散 eXtreme Scale 環境で使用できます。この機能がないと、クライアントのニア・キャッシュに失効データが保持される可能性があります。ただし、この JMS ベースのクライアント無効化メカニズムを使用しても、クライアント・ニア・キャッシュを更新する場合の時間帯を考慮に入れる必要があります。実行時に更新の公開に遅延があるためです。

ピアツーピア・レプリカ生成メカニズムは、分散とローカルの両方の eXtreme Scale環境で使用できます。 これは、ObjectGrid コアツーコア・レプリカ生成プロセスであり、これにより、ローカル ObjectGrid と分散 ObjectGrid の間で流れるデータ更新が可能になります。例えば、このメカニズムを使用すると、分散グリッドからローカル ObjectGrid に、あるいはあるグリッドから別のシステム・ドメインにある別のグリッドに、データ更新を移動させることができます。

JMSObjectGridEventListener の場合、ユーザーは、必要な JMS リソースを取得するために、JMS および Java Naming and Directory Interface (JNDI) 情報を構成する必要があります。 さらに、複製関連のプロパティーを正しく設定する必要があります。JEE 環境では、Web と Enterprise JavaBean (EJB) の両方のコンテナーで JNDI が使用可能になっている必要があります。この場合、外部 JMS リソースを取得したい場合を除いて JNDI プロパティーはオプションです。

このイベント・リスナーには、XML を使用するか、プログラマチックな方法を使用して構成できるプロパティーがあります。これは、クライアント無効化のみ、ピアツーピア・レプリカ生成のみ、またはその両方に使用できます。必要な機能を実現するための振る舞いをカスタマイズする場合は、ほとんどのプロパティーはオプションです。

詳しくは、JMSObjectGridEventListener API を参照してください。

詳しくは、JMSObjectGridEventListener API を参照してください。

JMSObjectGridEventListener プラグインの拡張

JMSObjectGridEventListener プラグインを使用すると、グリッド内のデータが変更または除去されたときに、ピア ObjectGrid インスタンスが更新を受信できます。また、eXtreme Scale グリッドからエントリーが更新または除去されたときに、クライアントが通知を受信することも可能です。このトピックでは、JMS メッセージが受信されたときに、アプリケーションが通知を受け取れるように、JMSObjectGridEventListener プラグインを拡張する方法について説明します。これは、クライアント無効化に CLIENT_SERVER_MODEL 設定を使用する場合に最も役立ちます。

receiver ロールで実行中の場合、JMSObjectGridEventListener インスタンスがグリッドから JMS メッセージ更新を受信すると、オーバーライドされた JMSObjectGridEventListener.onMessage メソッドが eXtreme Scale ランタイムによって自動的に呼び出されます。 これらのメッセージは、LogSequence オブジェクトの集まりを折り返します。LogSequence オブジェクトは onMessage メソッドに送られ、アプリケーションはこの LogSequence を使用して挿入、削除、更新、または無効化されたキャッシュ・エントリーを判別します。

onMessage 拡張ポイントを使用するために、アプリケーションは以下のステップを実行します。

  1. JMSObjectGridEventListener クラスが拡張し、onMessage メソッドがオーバーライドする新規クラスを作成します。
  2. ObjectGrid の ObjectGridEventListener と同様に拡張 JMSObjectGridEventListener を構成します。

拡張 JMSObjectGridEventListener クラスは、JMSObjectGridEventListener クラスの子クラスであり、initialize (オプション) と onMessage という 2 つのメソッドのみをオーバーライドできます。 JMSObjectGridEventListener クラスの子クラスが onMessage メソッド内の ObjectGrid や Session などの ObjectGrid 成果物を使用する必要がある場合、その子クラスは、initialize メソッドでその成果物を取得して、それをインスタンス変数としてキャッシュできます。 また、onMessage メソッドでは、キャッシュされた ObjectGrid 成果物は、渡された LogSequences の集まりを処理する場合に使用できます。

注: オーバーライドされた initialize メソッドは、親 JMSObjectGridEventListener を適切に初期化するために、super.initialize メソッドを呼び出す必要があります。

以下は、拡張 JMSObjectGridEventListener クラスの例です。

package com.ibm.websphere.samples.objectgrid.jms.price;

import java.util.*;
import com.ibm.websphere.objectgrid.*;
import com.ibm.websphere.objectgrid.plugins.LogElement;
import com.ibm.websphere.objectgrid.plugins.LogSequence;
import com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener;

public class ExtendedJMSObjectGridEventListener extends JMSObjectGridEventListener{
	protected static boolean debug = true;
	
    /**
     * This is the grid associated with this listener.
     */
    ObjectGrid grid;

    /**
     * This is the session associated with this listener.
     */
    Session session;
    
    String objectGridType;
    
    public List receivedLogSequenceList = new ArrayList();

 
	/* (non-Javadoc)
	 * @see com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener
				#initialize(com.ibm.websphere.objectgrid.Session)
	 */
	public void initialize(Session session) {
		// Note: if need to use any ObjectGrid artifact, this class need to get ObjectGrid
		//	 from the passed Session instance and get ObjectMap from session instance
		// for any transactional ObjectGrid map operation.
		
		super.initialize(session);  // must invoke super's initialize method.
		this.session = session; // cache the session instance, in case need to
		//			use it to perform map operation.
		this.grid = session.getObjectGrid(); // get ObjectGrid, in case need
		//			to get ObjectGrid information.
		
		if (grid.getObjectGridType() == ObjectGrid.CLIENT)
			objectGridType = "CLIENT";
		else if (grid.getObjectGridType() == ObjectGrid.SERVER)
			objectGridType = "Server";

		if (debug)
			System.out.println("ExtendedJMSObjectGridEventListener[" +
					objectGridType + "].initialize() : grid = "	+ this.grid);
	}
	
	/* (non-Javadoc)
	 * @see com.ibm.websphere.objectgrid.plugins.builtins.JMSObjectGridEventListener
				#onMessage(java.util.Collection)
	 */
	protected void onMessage(Collection logSequences) {
		System.out.println("ExtendedJMSObjectGridEventListener[" +
				objectGridType + "].onMessage(): ");
		
		Iterator iter = logSequences.iterator();
		
		while (iter.hasNext()) {
            LogSequence seq = (LogSequence) iter.next();
            
    		StringBuffer buffer = new StringBuffer();
    		String mapName = seq.getMapName();
    		int size = seq.size();
    		buffer.append("¥nLogSequence[mapName=" + mapName + ", size=" + size + ",
					objectGridType=" + objectGridType
    				+ "]: ");

    		Iterator logElementIter = seq.getAllChanges();
    		for (int i = seq.size() - 1; i >= 0; --i) {
    			LogElement le = (LogElement) logElementIter.next();
    			buffer.append(le.getType() + " -> key=" + le.getCacheEntry().getKey() + ", ");
    		}
    		buffer.append("¥n");

    		receivedLogSequenceList.add(buffer.toString());

    		if (debug) {
    			System.out.println("ExtendedJMSObjectGridEventListener["
						+ objectGridType + "].onMessage(): " + buffer.toString());
    		}
		}    
	}
	
	public String dumpReceivedLogSequenceList() {
		String result = "";
		int size = receivedLogSequenceList.size();
		result = result + "¥nExtendedJMSObjectGridEventListener[" + objectGridType
				+ "]: receivedLogSequenceList size = " + size + "¥n";
		for (int i = 0; i < size; i++) {
			result = result + receivedLogSequenceList.get(i) + "¥n";
		}
		return result;
	}

	public String toString() {
		return "ExtendedJMSObjectGridEventListener["
				+ objectGridType + " - " + this.grid + "]";
	}
}

構成

拡張 JMSObjectGridEventListener クラスは、クライアント無効化の場合にも、ピアツーピア・レプリカ生成メカニズムの場合にも同様に構成する必要があります。以下は XML 構成の例です。

<objectGrid name="PRICEGRID">
			<bean id="ObjectGridEventListener"
				className="com.ibm.websphere.samples.objectgrid.jms.
						price.ExtendedJMSObjectGridEventListener">
				<property name="invalidationModel" type="java.lang.String"
					value="CLIENT_SERVER_MODEL" description="" />
				<property name="invalidationStrategy" type="java.lang.String"
					value="INVALIDATE" description="" />
				<property name="jms_topicConnectionFactoryJndiName" type="java.lang.String"
					value="jms/TCF" description="" />
				<property name="jms_topicJndiName" type="java.lang.String"
					value="GRID.PRICEGRID" description="" />
				<property name="jms_topicName" type="java.lang.String"
					value="GRID.PRICEGRID" description="" />
				<property name="jms_userid" type="java.lang.String" value=""
					description="" />
				<property name="jms_password" type="java.lang.String" value=""
					description="" />					
			</bean>
			<backingMap name="PRICE" pluginCollectionRef="PRICE"></backingMap>
      </objectGrid>	
注: ObjectGridEventListener Bean の className は、一般 JMSObjectGridEventListener と同じプロパティーを持つ拡張 JMSObjectGridEventListener クラスによって構成されます。