ステートレス 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.javapackage 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.javapackage 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 を指定して別トランザクションとして処理されるようにします。 処理の最後にインターセプターによって例外発生の判定をします。 |