Spring は、Java アプリケーションの開発によく使用されるフレームワークです。WebSphere® eXtreme
Scale では、Spring を使用して eXtreme Scale トランザクションを管理したり、eXtreme Scale クライアントおよびサーバーの構成を行うことがサポートされています。
このタスクについて
以下のセクションで説明するように、Spring Framework は
eXtreme Scale と高度に統合可能です。
手順
- ネイティブ・トランザクション: Spring は、Java Platform,
Enterprise Edition アプリケーション・サーバーのスタイルに沿ったコンテナー管理トランザクションを提供しますが、Spring のメカニズムによりさまざまな実装を組み込むことができるという利点があります。このトピックでは、Spring とともに使用できる eXtreme Scale プラットフォーム・トランザクション・マネージャーについて説明します。
これを使用すると、プログラマーは、POJO (Plain Old Java Object) にアノテーションを付けてから、
Spring に eXtreme Scale からの Session を自動取得させて、
eXtreme Scale トランザクションを開始、コミット、ロールバック、中断、および再開させることができます。Spring トランザクションの詳細については、
公式の Spring 参照資料の第 10 章を参照してください。
次に、eXtreme Scale トランザクション・マネージャーを作成して、それをアノテーション付きの POJO で使用する方法を説明します。また、この方法をクライアントまたはローカル eXtreme Scale および連結された Data Grid スタイル・アプリケーションとともに使用する方法についても説明します。
- トランザクション・マネージャー: Spring と連動するために、eXtreme Scale は Spring PlatformTransactionManager の実装を提供します。このマネージャーは、管理対象の eXtreme Scale セッションを Spring が管理する POJO に提供することができます。
Spring は、アノテーションの使用により、トランザクション・ライフサイクルの単位で POJO のセッションを管理します。
次の XML スニペットは、トランザクション・マネージャーの作成方法を示しています。
<aop:aspectj-autoproxy/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="ObjectGridManager"
class="com.ibm.websphere.objectgrid.ObjectGridManagerFactory"
factory-method="getObjectGridManager"/>
<bean id="ObjectGrid"
factory-bean="ObjectGridManager"
factory-method="createObjectGrid"/>
<bean id="transactionManager"
class="com.ibm.websphere.objectgrid.spring.ObjectGridSpringFactory"
factory-method="getLocalPlatformTransactionManager"/>
</bean>
<bean id="Service" class="com.ibm.websphere.objectgrid.spring.test.TestService">
<property name="txManager" ref+"transactionManager"/>
</bean>
これは、transactionManager Bean が宣言され、Spring トランザクションを使用する Service Bean に接続されるところを示しています。
これはアノテーションを使用して示されますが、これが先頭に tx:annotation 文節のある理由です。
- ObjectGrid セッションの取得:
Spring が管理するメソッドを持つ POJO は現在、次のメソッドを使用して現行トランザクションのための ObjectGrid セッションを取得することができます。Session s = txManager.getSession();
これは、POJO が使用するセッションを返します。
同じトランザクションに関係する Bean は、このメソッドを呼び出したとき、同じセッションを受け取ります。
Spring はセッションに対して begin を自動的に処理し、また必要なときに commit または rollback を自動的に呼び出します。
また、セッション・オブジェクトから getEntityManager を呼び出すだけでも ObjectGrid EntityManager を取得することができます。
- スレッドの ObjectGrid インスタンスの設定: 単一の Java 仮想マシン
(JVM) で多数の ObjectGrid インスタンスをホストすることができます。JVM に置かれた各プライマリー断片には独自の ObjectGrid インスタンスがあります。
リモート ObjectGrid に対してクライアントとして機能する JVM は、connect メソッドの ClientClusterContext から戻される ObjectGrid インスタンスを使用して、その Grid と対話します。
ObjectGrid の Spring トランザクションを使用して POJO でメソッドを呼び出す前に、使用する ObjectGrid インスタンスでスレッドを事前準備する必要があります。
TransactionManager インスタンスには、特定の ObjectGrid インスタンスの指定を可能にするメソッドがあります。
これが指定されると、後続の txManager.getSession 呼び出しはその ObjectGrid インスタンスのセッションを返します。
次の例は、この機能を実行するためのサンプル・メインを示しています。
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(new String[]
{"applicationContext.xml"});
SpringLocalTxManager txManager = (SpringLocalTxManager)ctx.getBean("transactionManager");
txManager.setObjectGridForThread(og);
ITestService s = (ITestService)ctx.getBean("Service");
s.initialize();
assertEquals(s.query(), "Billy");
s.update("Bobby");
assertEquals(s.query(), "Bobby");
System.out.println("Requires new test");
s.testRequiresNew(s);
assertEquals(s.query(), "1");
ここでは Spring ApplicationContext を使用します。
ApplicationContext は、txManager への参照を取得して、このスレッドで使用する ObjectGrid を指定するために使用されます。
次にコードは、サービスへの参照を取得して、そのサービス上でメソッドを呼び出します。
このレベルの各メソッドにより、Spring はセッションを作成し、メソッド呼び出しの周辺で begin/commit 呼び出しを行います。
例外が発生するとロールバックが行われます。
- SpringLocalTxManager インターフェース: SpringLocalTxManager
インターフェースは ObjectGrid プラットフォーム・トランザクション・マネージャーによって実装されるもので、パブリック・インターフェースをすべて持っています。このインターフェース上のメソッドは、スレッドで使用する ObjectGrid インスタンスを選択し、そのスレッドのセッションを取得するためのものです。
ObjectGrid ローカル・トランザクションを使用する POJO には、このマネージャー・インスタンスへの参照を入れる必要があります。また、単一インスタンスのみを作成する必要があります (つまり、そのスコープは singleton でなければなりません)。このインスタンスは、ObjectGridSpringFactory 上の静的メソッドを使用して作成されます。
getLocalPlatformTransactionManager()。
制約事項: WebSphere eXtreme Scale は、主としてスケーラビリティーと関係があるさまざまな理由から、JTA および 2 フェーズ・コミットをサポートしません。したがって、最後の単一フェーズ参加者の場合を除き、ObjectGrid は XA または JTA タイプのグローバル・トランザクションでは対話しません。
このプラットフォーム・マネージャーは、ローカル ObjectGrid トランザクションの使用を Spring 開発者のためにできるだけ容易にするように意図されています。