読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

データストアを使ったカウンターサーブレットのサンプル

Java Google App Engine

ドキュメントを見ながら、データストアを使ったカウンターのサンプルを作ってみました。

カウンタの値を格納するクラス

データストアでは、Java Data Objects(JDO)の標準インターフェイスを介して、任意のエンティティ(アノテーションが付与されたPOJO)を永続化できます。カウンターをつくるので、まずはカウンタの値を格納するエンティティを作成します。

package test;

import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

/*
 * カウンタの値
 */
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Count {
    
    // インスタンスは1つなのでプライマリーキーは固定
    @PrimaryKey
    private String id = "count";
    @Persistent
    private Integer value = 0;
    
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public Integer getValue() {
        return value;
    }
    public void setValue(Integer value) {
        this.value = value;
    }
}

カウンターサーブレット

あとは、カウンタ値を読み込んで更新するサーブレットを作ればOK。

package test;

import java.io.IOException;

import javax.jdo.JDOHelper;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import javax.jdo.Transaction;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class CounterServlet extends HttpServlet {
    
    /**
     *  GETメソッドを処理する。
     */
    public void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws IOException {
        resp.setContentType("text/plain");
        
        PersistenceManager pm = null;
        try {
            // PersistenceManager を取得
            pm = getPersistenceManager();
            
            // トランザクション
            Transaction tx = pm.currentTransaction();
            try {
                tx.begin(); // トランザクション開始
                
                Count c = null;
                try {
                    // 値クラスのインスタンスを取り出す。
                    c = pm.getObjectById(Count.class, "count");
                    c.setValue(c.getValue()+1); // 値があればインクリメント
                } catch ( JDOObjectNotFoundException e ) {
                    // 初回のアクセスで値がない場合、ここに来る。
                    c = new Count();
                }
                // 更新
                pm.makePersistent(c);
                // 値を表示する。
                resp.getWriter().println("count :" + String.valueOf( c.getValue() ));
                
                tx.commit(); // コミット
            } finally {
                if (tx.isActive()) tx.rollback();
            }
            
        } finally {
            // PersistenceManager はクローズ必須。
            if ( pm != null ) pm.close();
        }
    }
    
    /**
     * {@link PersistenceManager}を取得する。
     * @return {@link PersistenceManager}
     */
    public static PersistenceManager getPersistenceManager() {
        return pmfInstance.getPersistenceManager();
    }
    /**
     * {@link PersistenceManagerFactory}は作成コストが高いらしいのでアプリケーションごとに一意にすること。
     * 本来は専用のホルダクラスを用意するのがよいみたいだが、とりあえずサーブレット自身に持たせる。
     */
    private static final PersistenceManagerFactory pmfInstance =
        JDOHelper.getPersistenceManagerFactory("transactions-optional");
}

動いている様子

動いている様子はこちらから