2009年12月6日日曜日

コンテナ管理トランザクションであそぶ - (4/10) -

ビジネスBeanを作成する

ステートレス Session Beanを作成します。
ビジネスインターフェイスとセッションBeanを2組作成します。

Action.java
package com.mydomain.ejb;

import java.util.List;
import javax.ejb.*;

@Local
public interface Action
{
    public void regist(String message, int rollbak);
    
    public void insert(Message message);
    
    public void decorateInsert(Message message);

    public List<Message> getMessages();
    
    public void delete();
}
ActionImpl.java
package com.mydomain.ejb;

import java.util.*;
import javax.ejb.*;
import javax.persistence.*;
import static com.mydomain.ejb.MessageUtil.*;

@Stateless
public class ActionImpl implements Action
{
    @PersistenceContext(unitName="example-pu")
    private EntityManager em;
    
    @EJB
    private SubAction subAction;

    public void regist(String text, int rollback)          
    {       
        this.decorateInsert(createMessage(text, 2, rollback));
        this.insert(createMessage(text, 3, rollback));
        this.subAction.decorateInsert(createMessage(text, 5, rollback));
        this.subAction.insert(createMessage(text, 6, rollback));
        try
        {
            this.subAction.requiresNewInsert(createMessage(text, 8, rollback));
        }
        catch(Exception exp){}

        Message chkMessage = createMessage(text, 1, rollback);
        doRollback(chkMessage);
    }

    public void insert(Message message)          
    {
        setLogMessage(message, this.getClass(), "insert");
        this.em.persist(message);
        
        Message decMessage = createMessage(message);
        setNextLogMessage(decMessage);
        this.decorateInsert(decMessage);
        
        doRollback(message);
    }
    
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void decorateInsert(Message message)            
    {
        setLogMessage(message, this.getClass(), "decorateInsert");
        message.setText(message.getText() + "*");
        this.em.persist(message);

        doRollback(message);
    }

    public List<Message> getMessages()
    {
        String sql = "SELECT m FROM message AS m ORDER BY m.no";
        return this.em.createQuery(sql).getResultList();
    }

    public void delete()
    {
        this.em.createQuery("DELETE FROM message").executeUpdate();
    }
}
regist()メソッド
サーブレットから呼出されてセッションIDをアクセスログとして登録するメインの処理を開始します。
処理の最後にMessageUtil.doRollback()メソッドを呼出して例外発生の判定します。
insert()メソッド
セッションIDを登録します。
処理の最後にMessageUtil.doRollback()メソッドを呼出して例外発生の判定します。
decorateInsert()メソッド
セッションIDに『*』 アスタリスクを付けて登録します。
REQUIRES_NEW を指定して別トランザクションとして処理されるようにします。
処理の最後にMessageUtil.doRollback()メソッドを呼出して例外発生の判定します。


SubAction.java
package com.mydomain.ejb;

import javax.ejb.Local;

@Local
public interface SubAction
{
    public void insert(Message message);

    public void decorateInsert(Message message);
    
    public void requiresNewInsert(Message message);
}
SubActionImpl.java
package com.mydomain.ejb;

import javax.ejb.*;
import javax.persistence.*;
import static com.mydomain.ejb.MessageUtil.*;

@Stateless(name="subActionImpl")                 
public class SubActionImpl implements SubAction
{
    @PersistenceContext(unitName="example-pu")
    private EntityManager em;

    public void insert(Message message)          
    {
        setLogMessage(message, this.getClass(), "insert");
        this.em.persist(message);

        Message decMessage = createMessage(message);
        setNextLogMessage(decMessage);
        this.decorateInsert(decMessage);

        doRollback(message);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void decorateInsert(Message message)            
    {
        setLogMessage(message, this.getClass(), "decorateInsert");
        message.setText(message.getText() + "*");
        this.em.persist(message);

        doRollback(message);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void requiresNewInsert(Message message)         
    {
        String sessionId = message.getText();
        message.setText(sessionId + "+");
        this.em.persist(message);

        Message decMessage = createMessage(message);
        setNextLogMessage(decMessage);
        decMessage.setText(sessionId);
        this.insert(decMessage);
    }
}
このクラスのEJB名(EJBコンテナ内での名前)をsubActionImpl に設定します。
insert()メソッド
セッションIDを登録します。
処理の最後にMessageUtil.doRollback()メソッドを呼出して例外発生の判定します。
decorateInsert()メソッド
セッションIDに『*』 アスタリスクを付けて登録します。
REQUIRES_NEW を指定して別トランザクションとして処理されるようにします。
処理の最後にMessageUtil.doRollback()メソッドを呼出して例外発生の判定します。
requiresNewInsert()メソッド
セッションIDに『+』 プラスを付けて登録します。
REQUIRES_NEW を指定して別トランザクションとして処理されるようにします。
処理の最後にインターセプターによって例外発生の判定をします。