Singleton Session Beans の並行処理 その3

この前のサンプルはちょっとあれでしたので Sun のチュートリアルとほぼ同じコードを載せておきます。

package counter.web;

import counter.ejb.CounterBean;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class Count {

    @EJB
    private CounterBean counterBean;
    private int hitCount;

    public Count() {
        this.hitCount = 0;
    }

    public int getHitCount() {
        hitCount = counterBean.getHits();
        return hitCount;
    }

    public void setHitCount(int newHits) {
        this.hitCount = newHits;
    }
}

——————————————————————————————————————————————

package counter.ejb;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.AccessTimeout;
import javax.ejb.ConcurrencyManagement;
import javax.ejb.ConcurrencyManagementType;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Singleton;

@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) // デフォルトで適用されるので無くてもOK
@Singleton
@AccessTimeout(value = 20000)
public class CounterBean {

    private int hits = 1;

    @Lock(LockType.WRITE) // デフォルトで適用されるので無くてもOK
    public int getHits() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(CounterBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return hits++;
    }
}

—————————————————————————————————————————————

<?xml version=’1.0′ encoding=’UTF-8′ ?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
    “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
      xmlns:h=”http://java.sun.com/jsf/html”>
    <body>
        <h:outputText value=”This page has been accessed #{count.hitCount} time(s).”/>
    </body>
</html>

以上です。

CounterBean をこのように変更することも可能です。

@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@Singleton
@AccessTimeout(value = 20000)
public class CounterBean {

    private int hits = 1;

    public synchronized int getHits() {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException ex) {
            Logger.getLogger(CounterBean.class.getName()).log(Level.SEVERE, null, ex);
        }
        return hits++;
    }
}

このような便利な機能を使わない場合は

@ConcurrencyManagement(ConcurrencyManagementType.CONCURRENCY_NOT_ALLOWED) とすればいいみたい。

う~ん・・・ いまいちこの機能のありがたさが解らない。

JEE6 が正式リリースされたら誰かが解りやすいサンプルと解説をしてくれるだろうからそれまで気長に待つとしよう(^^;

Hatena タグ:

Tags:

Leave a Reply