AWS Elastic Beanstalk を使う その11

色々環境が揃ってきたので、Tomcat の Session Persistence を拡張しようと思った感じですw。

まずはじめに Tomcat のソースをダウンロードしてEclipseにインポートしてビルドに必要なライブラリを追加します。

次に参考にするStoreクラスのソースを見ます。
FileStoreとJDBCStoreが参考になりますね。

んじゃ、これを参考に SimpleDBStoreを作りましょう。

FileStore と JDBCStore は StoreBase抽象クラスを継承してStoreインタフェースを実装しています。同じようにクラス定義します。

雛形はこんな感じかな。

package jp.cm.aws.tomcat.session;

import java.io.IOException;

import org.apache.catalina.Session;
import org.apache.catalina.Store;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StoreBase;

public class SimpleDBStore extends StoreBase implements Store{
	
	@Override
	public int getSize() throws IOException {
		return 1;
	}

	@Override
	public String[] keys() throws IOException {
		String[] ks = {"keykeykey"};
		return ks; 
	}

	@Override
	public Session load(String id) throws ClassNotFoundException, IOException {
		System.out.println("load");
		StandardSession session =
            (StandardSession) manager.createEmptySession();
		return session;
	}

	@Override
	public void remove(String id) throws IOException {
		System.out.println("remove");
	}

	@Override
	public void clear() throws IOException {
		System.out.println("clear");
	}

	@Override
	public void save(Session session) throws IOException {
		System.out.println("save");
	}

}

後はここにSessionの永続化と復元の処理を入れればOKのはず。

続きまして、上記の雛形がちゃんと動くか確認します。

アプリケーションフォルダの下にMETA-INFフォルダを作ってcontext.xmlを作ります。中身はこんな感じ。

<?xml version='1.0' encoding='utf-8'?>
<Context docBase="${catalina.home}/webapps/simpledb"
    path="/simpledb"
    reloadable="true"
    source="org.eclipse.jst.j2ee.server:test"
    backgroundProcessorDelay="1" >
  <Manager className="org.apache.catalina.session.PersistentManager"
      distributable="true"
      duplicates="0"
      saveOnRestart="true"
      maxActive="0"
      maxActiveSessions="0"
      minIdleSwap="0"
      maxIdleSwap="0"
      maxIdleBackup="0"
      maxInactiveInterval="0" 
      sessionCounter="0" >
      
     <Store className="jp.cm.aws.tomcat.session.SimpleDBStore"/> 
     
     <!--
    <Store className="org.apache.catalina.session.FileStore"
	 directory="${catalina.home}/logs/sessions" >
	</Store>
     -->
	
    <!--
    <Store className="org.apache.catalina.session.JDBCStore"
        checkInterval="1"
        connectionURL="jdbc:mysql://mydb.csnpjudtgu1o.us-east-1.rds.amazonaws.com:3306/awstest"
        driverName="com.mysql.jdbc.Driver"
        sessionAppCol="app_name"
        sessionDataCol="session_data"
        sessionIdCol="session_id"
        sessionLastAccessedCol="last_access"
        sessionMaxInactiveCol="max_inactive"
        sessionTable="tomcat_sessions"
        sessionValidCol="valid_session" />
    -->
  </Manager>
</Context>

このままだとSimpleDBStoreクラスが見つからないと怒られるので、
TOMCAT_HOME/libにクラスをコピーして置きます。jar化してもOK。

さて、無事にSession Persistenceをしてくれるカスタムクラスの作成に成功しました〜。

ちゃんと動いているか確認してみましょう。

このアプリにひとつjspを作って以下のようにセッションに書き込みをしてみます。

session.setAttribute("key1","value1");

このjspをブラウザから叩くと、以下のようにTomcatのログが出ました!!

2011/01/23 22:27:44 org.apache.catalina.session.PersistentManagerBase swapIn

あとは、SimpleDBにセッション情報を書き込む処理だけですね。

これは、AWS SDK for Java をダウンロードしてlibにjarを追加してごにょごにょすればすぐにできるはず。

今日はここまで。