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