SlideShare a Scribd company logo
1 of 57
Beginning JavaEE6 勉強会(3)
      -Enterprise JavaBean-

                        Hiroki Inagaki
                               @inatus
              http://github.com/inatus
目次
6.      Enterprise JavaBeans
7.      セッションBeanとタイマーサービス
8.      コールバックとインターセプタ
9.      トランザクションとセキュリティ
     5/16/2012       Beginning JavaEE6 勉強会(1)   2
第6章
                      Enterprise
                      JavaBeans




5/16/2012   Beginning JavaEE6 勉強会(3)   3
EJBとは
 トランザクションとセキュリティを扱うサーバ
  サイドのコンポーネント
 ビジネスロジックをカプセル化
 メッセージング、スケジューリング、リモート
  アクセス、SOAP/REST、DI、AOPを扱う
 JDBC、JavaMail、JPA、JTA、JMS、JAAS、
  JNDI、RMIと統合




5/16/2012   Beginning JavaEE6 勉強会(1)   4
第7章
                      セッションBeanとタ
                      イマーサービス




5/16/2012   Beginning JavaEE6 勉強会(3)   5
セッションBean
 EJBの核
 ビシネスロジックをカプセル化する
 以下の種類がある
      ステートレス
               対話状態を保持しない
               1つのメソッドで完結
      ステートフル
               対話状態を保持する
               複数のメソッドにまたがって利用
      シングルトン
               複数のクライアントが同時にアクセス



5/16/2012             Beginning JavaEE6 勉強会(1)   6
ステートレスBean
 最も良く使用される
 単一のメソッド呼び出しでタスクが完了するビ
  ジネスプロセスを実行する
 一定の数のインスタンスがプール内に格納され
  る
      複数のクライアント間で再利用できるため、最も効
        率が良い
                EJBコンテナ
               インスタンスプール
               インスタン
                 ス
                             インスタン
                               ス
     クライアント
               インスタン                      クライアント
                 ス

5/16/2012      Beginning JavaEE6 勉強会(3)            7
ステートレスBean
 @Stateless
 public class MemberEJB {

     @PersistenceContext(unitName = "sample")
     private EntityManager em;

     public Member findMemberById(Long id) {
       return em.find(Member.class, id);
     }

     public Member createMember(Member member) {
       em.persist(member);
       return member;
     }
 }



5/16/2012               Beginning JavaEE6 勉強会(3)   8
ステートフルBean
 前のステップの状態に依存する複数ステップを
  含むタスクに使用できる
 例えば、ショッピングサイトのように、商品を
  選択してから決済が完了するまでショッピング
  カートの中身が保持されなければならないと
  いった場合に使用する
 Beanインスタンスとクライアントは一対一で紐
  付けられる
                       EJBコンテナ
            ①要求
                              ②生成
            ③呼出し   インスタン
                     ス           インスタン
     クライアント                        ス
                                              クライアント

5/16/2012          Beginning JavaEE6 勉強会(3)            9
ステートフルBean
@Stateful
@StatefulTimeout(value = 15, unit = TimeUnit.MINUTES)
public class CartEJB {

     private Set<Item> cart = new LinkedHashSet<Item>();

     public void addItem(Item item) {
       cart.add(item);
     }

     public void removeItem(Item item) {
       cart.remove(item);
     }
}




    5/16/2012               Beginning JavaEE6 勉強会(3)       10
シングルトンBean
 アプリケーションごとに1つのインスタンスが
  生成される
 各クライアントは1つのインスタンスを共有す
  る
 同時実行の制御を行う必要がある
 初期化の次期や、複数のシングルトンBeanを初
  期化する順序を考慮する必要がある

                         EJBコンテナ
                          インスタン                 クライアント
                            ス

            クライアント
                                                クライアント
5/16/2012            Beginning JavaEE6 勉強会(3)            11
シングルトンBean
@Singleton
public class CacheEJB {

    private Map<Long, Object> cache =
       new HashMap<Long, Object>();

    public void addToCache(Long id, Object target) {
      if (!cache.containsKey(id)) {
          cache.put(id, target);
      }
    }

    public void removeFromCache(Long id) {
      cache.remove(id);
    }
}


5/16/2012                 Beginning JavaEE6 勉強会(3)     12
セッションBeanモデル
   Beanクラスの定義にインタフェースを用いる方
    法と用いない方法がある
      リモート・インタフェース
               EJBコンテナが動作しているJVMインスタンスの外部にクラ
                イアントが存在する場合に使用
               RMIを利用する
      ローカル・インタフェース
               同じJVM内の別のEJBやWebコンポーネントを呼び出す
      インタフェースのないビュー
               ローカルビューの一種
               すべてのパブリックメソッドをローカルに公開する




5/16/2012              Beginning JavaEE6 勉強会(3)   13
セッションBeanモデル


                              クライアント




   アプリケーションサーバ1                            アプリケーションサーバ2
      EJBコンテナ                                EJBコンテナ
        Bea          Bea                          Bea       Bea
         n            n         リモート               n         n
              ローカル

      EJBコンテナ                                           EJBコンテナ
      コンポーネント                                           コンポーネント




5/16/2012              Beginning JavaEE6 勉強会(3)                   14
ローカル&リモート・インタフェース
@Local
public interface MemberEJBLocal {
  Member findMemberById(Long id);
}

@Remote
public interface MemberEJBRemote {
  Member createMember(Member member);
}

@Stateless
public class MemberEJB implements MemberEJBLocal,
         MemberEJBRemote {
  ...
}



5/9/2012             Beginning JavaEE6 勉強会(3)       15
インタフェースのないビュー
@Stateless
@LocalBean
public class MemberEJB {
  ...
}




5/9/2012              Beginning JavaEE6 勉強会(3)   16
クライアントからのBean呼び出し
   リモート&ローカル・インタフェースの場合
     インタフェースオブジェクトに@EJBでDIする
@EJB MemberEJBRemote memberEJBRemote;
@EJB MemberEJBLocal memberEJBLocal;



   インタフェースのないビューの場合
     クラスのオブジェクトに@EJBでDIする
@EJB MemberEJB memberEJB;




5/9/2012          Beginning JavaEE6 勉強会(3)   17
DI(依存性注入)
以下のような方法がある
 @EJB
      EJBのリモート&ローカル・インタフェース、イン
           タフェースのないビューの参照を注入
   @PersistenceContext, @PersistenceUnit
      EntityManager,   EntityManagerFactoryの依存関係
           を表す
   @WebServiceRef
      Webサービスへの参照を注入

   @Resource
      JDBCデータソース、セッション・コンテキスト、
           ユーザ・トランザクション等の参照を注入
5/9/2012            Beginning JavaEE6 勉強会(3)        18
非同期呼び出し
 印刷やメール送信などの処理が終了するまで待
  たずに、続く処理を続行する
 セッションBeanのメソッドまたはクラスに
  @Asynchronousを付加する
 非同期呼び出しからの戻り値を用いる場合は戻
  り値の型にFuture<V>を使用する




5/9/2012   Beginning JavaEE6 勉強会(3)   19
非同期呼び出し
@Stateless
@Asynchronous
public class OrderEJB {

           public void sendEmailConfirmation(Order order) {
                   // Emailの送信処理
           }

           public void printOrder(Order order) {
                   // 注文書の印刷処理
           }

           public Future<Integer> CalcShippingCost(
                   Order order) {
                   int shippingCost = 0;
                   // 送料計算処理
                   return AsyncResult<Integer>(shippingCost);
           }
5/9/2012                   Beginning JavaEE6 勉強会(3)             20
タイマサービス
   特定の時間に特定の処理を起動する
      毎晩在庫レポートを出力
      毎月売上を集計
      毎年ユーザの誕生日にメールを送信

   起動対象のメソッドに@Scheduleアノテーショ
    ンとタイマを設定




5/9/2012     Beginning JavaEE6 勉強会(3)   21
タイマサービス
@Stateless
public class TimerEJB {

    // 毎日0時0分0秒に実行
      @Schedule(second = "0", minute = "0", hour = "0")
      public void outputReport() {
        // 日次レポート出力処理
      }

    // 毎月の最終日の22時に実行
      @Schedule(hour = "22", dayOfMonth = "Last")
      public void addUpSales() {
        // 月次の売上を集計
      }
}



5/9/2012                  Beginning JavaEE6 勉強会(3)        22
タイマサービス
@Stateless
public class MemberEJB {

   @Resource
   TimerService timerService;
   // Memberの誕生日にタイマを設定
   public Member createMember(Member member) {
      em.persist(member);
      ScheduleExpression membersBirthday
                  = new ScheduleExpression()
                 .dayOfMonth(member.getBirthDay())
                 .month(member.getBirthMonth());
      timerService.createCalendarTimer
                 (membersBirthday,
                 new TimerConfig(member, true));
      return member;
   }
// 次頁へ続く
5/9/2012              Beginning JavaEE6 勉強会(3)       23
タイマサービス
// 前頁から続き

    // タイマが切れたときにEメールを送信
    @Timeout
    public void sendBirthdayEmail(Timer timer) {
       Member member = (Member) timer.getInfo();
       // Eメール送信処理
    }
}




5/9/2012                Beginning JavaEE6 勉強会(3)   24
第8章
                     コールバックと
                     インターセプタ




5/9/2012   Beginning JavaEE6 勉強会(3)   25
コールバックとインターセプタ
   コールバック
      Beanの状態遷移が起きる際に任意のメソッドを呼び
       出すこと
      Beanごとに設定する


   インターセプタ
      AOPと同様の機能
      Beanのメソッドを呼び出す際に、別のメソッドを呼
       び出し割り込み処理を行う
      複数のBeanに対して横断的に設定できる




5/9/2012      Beginning JavaEE6 勉強会(3)   26
コールバック
   ステートレスBean、シングルトンBeanのライフ
    サイクル


                      存在しない状態

1.インスタンス生成                             5.@PreDestroy呼出し
2.依存性注入
3.@PostConstruct呼出し

                        準備状態



                                     4.メソッド呼出し


5/9/2012          Beginning JavaEE6 勉強会(3)                27
コールバック
    ステートフルBeanのライフサイクル

                                           7.タイムアウト
              存在しない状態
                                8.@Removeおよび
1.インスタンス生成                        @PreDestroy呼出し
2.依存性注入
3.@PostConstruct
    呼出し                    6.@PostActive呼出し

                   準備状態                         非活性化状態

                            5.@PrePassive呼出し
               4.メソッド呼出し


 5/9/2012           Beginning JavaEE6 勉強会(3)             28
コールバック
@Stateful
public class CartEJB {

   @Resource
   private DataSource ds;
   private Connection conn;

   @PostConstruct
   @PostActivate
   private void init() throws SQLException {
      conn = ds.getConnection();
   }

   @PreDestroy
   @PrePassivate
   private void close() throws SQLException {
      conn.close();
   }
5/9/2012                 Beginning JavaEE6 勉強会(3)   29
コールバックメソッド
   引数なしのvoidメソッドであること
   チェック例外のスロー不可、実行時例外は可
   アクセス修飾子はすべて使用可
   static、finalは不可
   1メソッドに複数のアノテーションを指定可
   同じアノテーションを2度以上指定不可




5/9/2012   Beginning JavaEE6 勉強会(3)   30
インターセプタ
   AroundInvokeインターセプタ
      Beanごとに適用
      Bean内のすべてのメソッドに対して適用される


    クラス・インターセプタ
          複数のBeanに横断的に適用
          インターセプト用のクラスを定義


    ライフサイクル・インターセプタ
          コールバックの機能を複数のBeanに横断的に適用


5/9/2012         Beginning JavaEE6 勉強会(3)   31
AroundInvokeインターセプタ
@Stateless
public class MemberEJB {

   public Member findMemberById(Long id) {
     ...
   }
   public Member createMember(Member member) {
     ...
   }

   @AroundInvoke
   private Object recordLog(InvocationContext ic)
      throws Exception {
      // メソッド呼び出し前ログ書き込み処理
      try {
         return ic.proceed();
      finally {
         // メソッド呼び出しログ書き込み処理
   {
5/9/2012                Beginning JavaEE6 勉強会(3)    32
AroundInvokeインターセプタの定義
@AroudInvoke
@AroudInvoke
Object <メソッド名>(InvocationContext ic) ic)
Object <メソッド名>(InvocationContext
  throws Exception;
   throws
          Exception;

   引数はjavax.interceptor.InvocationContext型
   戻り値はObject型
   チェック例外をスロー可
   アクセス修飾子はすべて使用可
   static、finalは不可
   proceedメソッドでビジネスメソッドを呼び出
    し、結果を返す
      ただしチェーン内に次のインターセプタメソッドが
           ある場合はそのインターセプタメソッドを呼び出す
5/9/2012              Beginning JavaEE6 勉強会(3)   33
クラス・インターセプタ
public class LoggingInterceptor {

    @AroundInvoke
    private Object recordLog(InvocationContext ic)
       throws Exception {
       // メソッド呼び出し前ログ書き込み処理
       try {
          return ic.proceed();
       finally {
          // メソッド呼び出しログ書き込み処理
    {
{




5/9/2012                 Beginning JavaEE6 勉強会(3)    34
クラス・インターセプタ
@Stateless
public class MemberEJB {

    @Interceptors(LoggingInterceptor.class)
    public Member findMemberById(Long id) {
      ...
    }
    public Member createMember(Member member) {
      ...
    }
}




5/9/2012              Beginning JavaEE6 勉強会(3)    35
クラス・インターセプタ
 インターセプタとする任意のクラスのメソッド
  に@AroundInvokeアノテーションを使用
 インターセプタを適用したいメソッドまたはク
  ラスに@Interceptorsアノテーションを使用
      メソッドに指定すると指定したメソッドのみイン
       ターセプタを適用する
      クラスに指定するとクラス内のすべてのメソッドに
       インターセプタを適用する
              特定のメソッドのみをインターセプタ適用外とする場合は
               @ExcludeClassInterceptorsアノテーションを用いる




5/9/2012               Beginning JavaEE6 勉強会(3)   36
ライフサイクル・インターセプタ
public class LoggingInterceptor {

    @PostConstruct
    private void init() {
       // 初期化処理
    {
{




5/9/2012                    Beginning JavaEE6 勉強会(3)   37
ライフサイクル・インターセプタ
@Stateless
@Interceptors(LoggingInterceptor.class)
public class MemberEJB {

    public Member findMemberById(Long id) {
      ...
    }
    public Member createMember(Member member) {
      ...
    }
}




5/9/2012              Beginning JavaEE6 勉強会(3)    38
ライフサイクル・インターセプタ
 Beanのライフサイクルに応じたコールバックを
  複数のBeanを横断的に適用可能
 @PostConstruct, @PrePassivate, @PostActiva
  te, @PreDestroyが指定可能
 インターセプタを適用したいクラスに
  @Interceptorsアノテーションを使用




5/9/2012       Beginning JavaEE6 勉強会(3)    39
第9章
                     トランザクションと
                     セキュリティ




5/9/2012   Beginning JavaEE6 勉強会(3)   40
EJBでのトランザクションサポート
   コンテナ管理トランザクション(CMT)
      トランザクションの開始、コミット、ロールバック
       をコンテナが自動的に管理
      なにも設定しない時のデフォルトの動作

   Bean管理トランザクション(BMT)
      トランザクションの開始、コミット、ロールバック
        をBean内に明示的に記述




2012/5/16      Beginning JavaEE6 勉強会(3)   41
コンテナ管理トランザクション(CMT)
 @Stateless
 public class MemberEJB {

     @PersistenceContext(unitName = "sample")
     private EntityManager em;

     public Member createMember(Member member) {
       em.persist(member);
       return member;
     }
 }




5/9/2012               Beginning JavaEE6 勉強会(3)    42
CMTの属性
   クライアントがトランザクション対応のメソッ
    ドを呼び出すときに、そのメソッドがトランザ
    クション内で呼び出されているか否かによっ
    て、以下の4つうちどの動作をするかを設定で
    きる
      コンテナがクライアントのトランザクションを利用
       する
      新しいトランザクションを開始してメソッドを実行
       する
      トランザクションを使用しないでメソッドを実行す
       る
      例外をスローする

   クラスやメソッドに@TransactionAttributeを
5/9/2012      Beginning JavaEE6 勉強会(3)   43
CMTの属性
CMT属性           トランザクション内でない トランザクション内
REQUIRED        新しいトランザクション               呼出し元のトランザクション
REQUIRED_NEW    新しいトランザクション               新しいトランザクション
SUPPORTS        トランザクションを使用し 呼出し元のトランザクション
                ない
MANDATORY       例外                        呼出し元のトランザクション
NOT_SUPPORTED   トランザクションを使用し トランザクションを使用しな
                ない           い
NEVER           トランザクションを使用し 例外
                ない




5/9/2012             Beginning JavaEE6 勉強会(3)           44
CMTの属性
 @Stateless
 @TransactionAttribute
   (TransactionAttributeType.SUPPORTS)
 public class MemberEJB {

     @PersistenceContext(unitName = "sample")
     private EntityManager em;

     public Member createMember(Member member) {
       em.persist(member);
       return member;
     }
 }




5/9/2012               Beginning JavaEE6 勉強会(3)    45
CMTのロールバック
 デフォルトでは非チェック例外が発生した場合
  のみトランザクションがロールバックされる
 明示的にトランザクションをロールバックする
  にはDIによりSessionContextを取得し
  setRollBackOnly()メソッドを呼び出す




5/9/2012   Beginning JavaEE6 勉強会(3)   46
CMTのロールバック
 @Stateless
 public class MemberEJB {

     @PersistenceContext(unitName = "sample")
     private EntityManager em;
     @Resource
     private SessionContext ctx;

     public Member createMember(Member member) {
       if (member.isValidMember) {
           ctx.setRollBackOnly();
       }
       em.persist(member);
       return member;
     }
 }


5/9/2012               Beginning JavaEE6 勉強会(3)    47
例外処理
 デフォルトでは非チェック例外が発生した場合
  のみトランザクションがロールバックする
 ユーザ例外クラスに@ApplicationExceptionを
  付加することでチェック例外/非チェック例外
  に関わらず、ロールバックの有無を設定可能




5/9/2012   Beginning JavaEE6 勉強会(3)   48
例外処理
 @Stateless
 public class MemberEJB {

     @PersistenceContext(unitName = "sample")
     private EntityManager em;
     @Resource
     private SessionContext ctx;

     public Member createMember(Member member)
       throws MemberInvalidException {
       if (member.isValidMember) {
           throw new MemberInvalidException();
       }
       em.persist(member);
       return member;
     }
 }

5/9/2012               Beginning JavaEE6 勉強会(3)   49
例外処理
 @ApplicationException(rollback = true)
 public class MemberInvalidException
   extends Exception {

     public MemberInvalidException() {

     }

     public MemberInvalidException(String message) {
       super(message);
     }
 }




5/9/2012                 Beginning JavaEE6 勉強会(3)      50
Bean管理トランザクション(BMT)
 Beanのメソッド内に明示的にトランザクション
  の開始・コミット・ロールバックを記述
 @TransactionManagementアノテーションをBean
  クラスに付加するとBean管理のトランザクショ
  ンとなる
 DIによりUserTransactionのインスタンスを生
  成し、begin(), commit(), rollback()メソッ
  ドによりトランザクションの操作を行う




5/9/2012    Beginning JavaEE6 勉強会(3)   51
Bean管理トランザクション(BMT)
 @Stateless
 @TransactionManagement(
   TransactionManagementType.BEAN)
 public class MemberEJB {

    @PersistenceContext(unitName = "sample")
    private EntityManager em;
    @Resource
    private UserTransaction ut;

    public Member createMember(Member member) {
      ut.begin();
      em.persist(member);
      if (member.isValidMember) {
          ut.rollback();
      }
      ut.commit();
      return member;
    }
5/9/2012              Beginning JavaEE6 勉強会(3)    52
セキュリティ
 プリンシパルのロールごとにBean全体または一
  部メソッドのアクセスを制御することができる
 プリンシパル
      認証を行ったユーザのユーザ名
              making
              kjstylepp
              inatus など
   ロール
      プリンシパルごとに割り当てられるグループ名
              Employee
              Admin
              User など


5/9/2012                   Beginning JavaEE6 勉強会(3)   53
宣言型のセキュリティ
 アノテーションをBeanクラスまたはメソッドに
  付加し、アクセスを制御する
 @PermitAll
      すべてのロールにアクセス許可を与える

   @DenyAll
      すべてのロールからのアクセスを拒否する
      特定の環境でメソッドへのアクセスを拒否する場合
           などに利用する
   @RollsAllowed
      リストに指定されているロールにアクセス許可を与
           える


5/9/2012            Beginning JavaEE6 勉強会(3)   54
宣言型のセキュリティ
 @Stateless
 @RolesAllowed({“user”, “employee”, “admin”})
 public class MemberEJB {

    @PermitAll
    public Member findMemberById(Long id) {
      ...
    }
    public Member createMember(Member member) {
      ...
    }
    @RolesAllowed(“admin”)
    public void deleteMember(Member member) {
      ...
    }
    @DenyAll
    public Member findConfidentialMember(Long id) {
      ...
    }
5/9/2012               Beginning JavaEE6 勉強会(3)       55
プログラムによるセキュリティ
   以下の場合に用いる
      メソッド内のコードのブロックにアクセスを許可ま
       たは拒否をする場合
      個人へのアクセス許可または拒否をする場合

   DIでSessionContextのインスタンスを生成し、
    以下のメソッドを用いる
      isCallerInRole():指定したロールであるかを判定
       しboolean値を返す
      getCallerPrincipal():Principalオブジェクト返
       す
              Principal.getName()でプリンシパルの名前を取得可能



5/9/2012               Beginning JavaEE6 勉強会(3)     56
宣言型のセキュリティ
 @Stateless
 @RolesAllowed({“user”, “employee”, “admin”})
 public class MemberEJB {

     @resource
     SessionContext ctx;

     public Member findMemberById(Long id) {
       if (ctx.isCallerInRole(“user”) {
           // 本の検索処理
       }
       if (ctx.getCallerPrincipal().getName()
           .equals(“inatus”) {
           return findConfidentialMember(id);
       }
       ...
 }


5/9/2012                Beginning JavaEE6 勉強会(3)   57

More Related Content

What's hot

20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatch20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatchJun Inose
 
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側賢 秋穂
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427Nobuhiro Sue
 
JPA説明会
JPA説明会JPA説明会
JPA説明会Ryo Asai
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」Hiroyuki Ohnaka
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpNorito Agetsuma
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015Mikiya Okuno
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallMasatoshi Tada
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cNorito Agetsuma
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPAkawaba
 
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門minazou67
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQLRyusuke Kajiyama
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugY Watanabe
 
Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Hirofumi Iwasaki
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発Mitsuru Katoh
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Norito Agetsuma
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門minazou67
 
初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談Makoto Haruyama
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」Hiroaki NAKADA
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 

What's hot (20)

20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatch20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatch
 
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
20160521 大規模映像配信サービスの Java8による全面リニューアルの裏側
 
ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427ぽんぽこバレー勉強会 20120427
ぽんぽこバレー勉強会 20120427
 
JPA説明会
JPA説明会JPA説明会
JPA説明会
 
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
JavaOne 2015 報告会 @ 東京 「About MVC 1.0 & JSON-P」
 
JavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jpJavaOne2015報告会 Java EE アップデート #j1jp
JavaOne2015報告会 Java EE アップデート #j1jp
 
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
What's New in MySQL 5.7 Optimizer @MySQL User Conference Tokyo 2015
 
Java EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 FallJava EEハンズオン資料 JJUG CCC 2015 Fall
Java EEハンズオン資料 JJUG CCC 2015 Fall
 
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4cCDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
CDI2.0アップデート&クックブック #JavaDayTokyo #jdt2016_4c
 
はじめてのJPA
はじめてのJPAはじめてのJPA
はじめてのJPA
 
Java EE 再入門
Java EE 再入門Java EE 再入門
Java EE 再入門
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsugSpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
SpringMVCとmixer2で作るWebアプリのキホン 2013-01-24 Spring勉強会 #jsug
 
Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2 Java EE 7技術アップデート & 逆引き JSF 2.2
Java EE 7技術アップデート & 逆引き JSF 2.2
 
XPages 開発 Tips 百連発
XPages 開発 Tips 百連発XPages 開発 Tips 百連発
XPages 開発 Tips 百連発
 
Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015Jbatch実践入門 #jdt2015
Jbatch実践入門 #jdt2015
 
Java SE 再入門
Java SE 再入門Java SE 再入門
Java SE 再入門
 
初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談初心者エンジニアの システム構築 失敗談
初心者エンジニアの システム構築 失敗談
 
WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」WildFly Swarmではじめる「パーツとしてのJavaEE」
WildFly Swarmではじめる「パーツとしてのJavaEE」
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 

Viewers also liked

Beginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyBeginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyKinji Akemine
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyikeyat
 
Legend of Java Concurrency/Parallelism
Legend of Java Concurrency/ParallelismLegend of Java Concurrency/Parallelism
Legend of Java Concurrency/ParallelismYuichi Sakuraba
 
Beginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_studyBeginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_studyzuisener .
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能kimulla
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざいTetsuya Morimoto
 

Viewers also liked (6)

Beginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_studyBeginning Java EE 6 勉強会(2) #bje_study
Beginning Java EE 6 勉強会(2) #bje_study
 
Beginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_studyBeginning Java EE 6 勉強会(7) #bje_study
Beginning Java EE 6 勉強会(7) #bje_study
 
Legend of Java Concurrency/Parallelism
Legend of Java Concurrency/ParallelismLegend of Java Concurrency/Parallelism
Legend of Java Concurrency/Parallelism
 
Beginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_studyBeginning Java EE 6 勉強会(5) #bje_study
Beginning Java EE 6 勉強会(5) #bje_study
 
Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能Spring Framework ふりかえりと4.3新機能
Spring Framework ふりかえりと4.3新機能
 
ストリーミングのげんざい
ストリーミングのげんざいストリーミングのげんざい
ストリーミングのげんざい
 

Similar to Beginning Java EE 6 勉強会(3) #bje_study

JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようNorito Agetsuma
 
Beginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信upBeginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信upzuisener .
 
Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信zuisener .
 
Functional Testing in #YAPCASIA
Functional Testing in #YAPCASIAFunctional Testing in #YAPCASIA
Functional Testing in #YAPCASIAkyon mm
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストTsutomu Chikuba
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術Kiyokuni Kawachiya
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotationEIICHI KIMURA
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~normalian
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Tokuhiro Matsuno
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようAkira Shimosako
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Yuji Kubota
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterMasanori Oobayashi
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Yu Nobuoka
 
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入Takayuki Konishi
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発Takakiyo Tanaka
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Masatoshi Tada
 

Similar to Beginning Java EE 6 勉強会(3) #bje_study (20)

JJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめようJJUG 11月ナイトセミナー CDIをはじめよう
JJUG 11月ナイトセミナー CDIをはじめよう
 
Beginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信upBeginning java ee 6 13章メッセージ通信up
Beginning java ee 6 13章メッセージ通信up
 
Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信Beginning java ee 6 13章メッセージ通信
Beginning java ee 6 13章メッセージ通信
 
Functional Testing in #YAPCASIA
Functional Testing in #YAPCASIAFunctional Testing in #YAPCASIA
Functional Testing in #YAPCASIA
 
ビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテストビジネス的に高価値なアジャイルテスト
ビジネス的に高価値なアジャイルテスト
 
Maven2 plugin
Maven2 pluginMaven2 plugin
Maven2 plugin
 
Java仮想マシンの実装技術
Java仮想マシンの実装技術Java仮想マシンの実装技術
Java仮想マシンの実装技術
 
R5 3 type annotation
R5 3 type annotationR5 3 type annotation
R5 3 type annotation
 
Jsug 20160422 slides
Jsug 20160422 slidesJsug 20160422 slides
Jsug 20160422 slides
 
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
基礎から見直す ASP.NET MVC の単体テスト自動化方法 ~ Windows Azure 関連もあるかも~
 
Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)Javaで1から10まで書いた話(sanitized)
Javaで1から10まで書いた話(sanitized)
 
Groovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみようGroovyで楽にSQLを実行してみよう
Groovyで楽にSQLを実行してみよう
 
Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)Head toward Java 16 (Night Seminar Edition)
Head toward Java 16 (Night Seminar Edition)
 
WTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniterWTM53 phpフレームワーク いまさらcodeigniter
WTM53 phpフレームワーク いまさらcodeigniter
 
Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成Java による Web アプリケーションのプロトタイプのために最近使っている構成
Java による Web アプリケーションのプロトタイプのために最近使っている構成
 
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
Javaone2012 BoF2-02 コンテナでテストをまわせ!Java EEへの自動テストの導入
 
Cve 2013-0422
Cve 2013-0422Cve 2013-0422
Cve 2013-0422
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発ついに始まるJava EE 7時代のアプリケーション開発
ついに始まるJava EE 7時代のアプリケーション開発
 
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
Java EE 8先取り!MVC 1.0入門 [EDR2対応版] 2015-10-10更新
 

Beginning Java EE 6 勉強会(3) #bje_study

  • 1. Beginning JavaEE6 勉強会(3) -Enterprise JavaBean- Hiroki Inagaki @inatus http://github.com/inatus
  • 2. 目次 6. Enterprise JavaBeans 7. セッションBeanとタイマーサービス 8. コールバックとインターセプタ 9. トランザクションとセキュリティ 5/16/2012 Beginning JavaEE6 勉強会(1) 2
  • 3. 第6章 Enterprise JavaBeans 5/16/2012 Beginning JavaEE6 勉強会(3) 3
  • 4. EJBとは  トランザクションとセキュリティを扱うサーバ サイドのコンポーネント  ビジネスロジックをカプセル化  メッセージング、スケジューリング、リモート アクセス、SOAP/REST、DI、AOPを扱う  JDBC、JavaMail、JPA、JTA、JMS、JAAS、 JNDI、RMIと統合 5/16/2012 Beginning JavaEE6 勉強会(1) 4
  • 5. 第7章 セッションBeanとタ イマーサービス 5/16/2012 Beginning JavaEE6 勉強会(3) 5
  • 6. セッションBean  EJBの核  ビシネスロジックをカプセル化する  以下の種類がある  ステートレス  対話状態を保持しない  1つのメソッドで完結  ステートフル  対話状態を保持する  複数のメソッドにまたがって利用  シングルトン  複数のクライアントが同時にアクセス 5/16/2012 Beginning JavaEE6 勉強会(1) 6
  • 7. ステートレスBean  最も良く使用される  単一のメソッド呼び出しでタスクが完了するビ ジネスプロセスを実行する  一定の数のインスタンスがプール内に格納され る  複数のクライアント間で再利用できるため、最も効 率が良い EJBコンテナ インスタンスプール インスタン ス インスタン ス クライアント インスタン クライアント ス 5/16/2012 Beginning JavaEE6 勉強会(3) 7
  • 8. ステートレスBean @Stateless public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; public Member findMemberById(Long id) { return em.find(Member.class, id); } public Member createMember(Member member) { em.persist(member); return member; } } 5/16/2012 Beginning JavaEE6 勉強会(3) 8
  • 9. ステートフルBean  前のステップの状態に依存する複数ステップを 含むタスクに使用できる  例えば、ショッピングサイトのように、商品を 選択してから決済が完了するまでショッピング カートの中身が保持されなければならないと いった場合に使用する  Beanインスタンスとクライアントは一対一で紐 付けられる EJBコンテナ ①要求 ②生成 ③呼出し インスタン ス インスタン クライアント ス クライアント 5/16/2012 Beginning JavaEE6 勉強会(3) 9
  • 10. ステートフルBean @Stateful @StatefulTimeout(value = 15, unit = TimeUnit.MINUTES) public class CartEJB { private Set<Item> cart = new LinkedHashSet<Item>(); public void addItem(Item item) { cart.add(item); } public void removeItem(Item item) { cart.remove(item); } } 5/16/2012 Beginning JavaEE6 勉強会(3) 10
  • 11. シングルトンBean  アプリケーションごとに1つのインスタンスが 生成される  各クライアントは1つのインスタンスを共有す る  同時実行の制御を行う必要がある  初期化の次期や、複数のシングルトンBeanを初 期化する順序を考慮する必要がある EJBコンテナ インスタン クライアント ス クライアント クライアント 5/16/2012 Beginning JavaEE6 勉強会(3) 11
  • 12. シングルトンBean @Singleton public class CacheEJB { private Map<Long, Object> cache = new HashMap<Long, Object>(); public void addToCache(Long id, Object target) { if (!cache.containsKey(id)) { cache.put(id, target); } } public void removeFromCache(Long id) { cache.remove(id); } } 5/16/2012 Beginning JavaEE6 勉強会(3) 12
  • 13. セッションBeanモデル  Beanクラスの定義にインタフェースを用いる方 法と用いない方法がある  リモート・インタフェース  EJBコンテナが動作しているJVMインスタンスの外部にクラ イアントが存在する場合に使用  RMIを利用する  ローカル・インタフェース  同じJVM内の別のEJBやWebコンポーネントを呼び出す  インタフェースのないビュー  ローカルビューの一種  すべてのパブリックメソッドをローカルに公開する 5/16/2012 Beginning JavaEE6 勉強会(3) 13
  • 14. セッションBeanモデル クライアント アプリケーションサーバ1 アプリケーションサーバ2 EJBコンテナ EJBコンテナ Bea Bea Bea Bea n n リモート n n ローカル EJBコンテナ EJBコンテナ コンポーネント コンポーネント 5/16/2012 Beginning JavaEE6 勉強会(3) 14
  • 15. ローカル&リモート・インタフェース @Local public interface MemberEJBLocal { Member findMemberById(Long id); } @Remote public interface MemberEJBRemote { Member createMember(Member member); } @Stateless public class MemberEJB implements MemberEJBLocal, MemberEJBRemote { ... } 5/9/2012 Beginning JavaEE6 勉強会(3) 15
  • 17. クライアントからのBean呼び出し  リモート&ローカル・インタフェースの場合 インタフェースオブジェクトに@EJBでDIする @EJB MemberEJBRemote memberEJBRemote; @EJB MemberEJBLocal memberEJBLocal;  インタフェースのないビューの場合 クラスのオブジェクトに@EJBでDIする @EJB MemberEJB memberEJB; 5/9/2012 Beginning JavaEE6 勉強会(3) 17
  • 18. DI(依存性注入) 以下のような方法がある  @EJB  EJBのリモート&ローカル・インタフェース、イン タフェースのないビューの参照を注入  @PersistenceContext, @PersistenceUnit  EntityManager, EntityManagerFactoryの依存関係 を表す  @WebServiceRef  Webサービスへの参照を注入  @Resource  JDBCデータソース、セッション・コンテキスト、 ユーザ・トランザクション等の参照を注入 5/9/2012 Beginning JavaEE6 勉強会(3) 18
  • 19. 非同期呼び出し  印刷やメール送信などの処理が終了するまで待 たずに、続く処理を続行する  セッションBeanのメソッドまたはクラスに @Asynchronousを付加する  非同期呼び出しからの戻り値を用いる場合は戻 り値の型にFuture<V>を使用する 5/9/2012 Beginning JavaEE6 勉強会(3) 19
  • 20. 非同期呼び出し @Stateless @Asynchronous public class OrderEJB { public void sendEmailConfirmation(Order order) { // Emailの送信処理 } public void printOrder(Order order) { // 注文書の印刷処理 } public Future<Integer> CalcShippingCost( Order order) { int shippingCost = 0; // 送料計算処理 return AsyncResult<Integer>(shippingCost); } 5/9/2012 Beginning JavaEE6 勉強会(3) 20
  • 21. タイマサービス  特定の時間に特定の処理を起動する  毎晩在庫レポートを出力  毎月売上を集計  毎年ユーザの誕生日にメールを送信  起動対象のメソッドに@Scheduleアノテーショ ンとタイマを設定 5/9/2012 Beginning JavaEE6 勉強会(3) 21
  • 22. タイマサービス @Stateless public class TimerEJB { // 毎日0時0分0秒に実行 @Schedule(second = "0", minute = "0", hour = "0") public void outputReport() { // 日次レポート出力処理 } // 毎月の最終日の22時に実行 @Schedule(hour = "22", dayOfMonth = "Last") public void addUpSales() { // 月次の売上を集計 } } 5/9/2012 Beginning JavaEE6 勉強会(3) 22
  • 23. タイマサービス @Stateless public class MemberEJB { @Resource TimerService timerService; // Memberの誕生日にタイマを設定 public Member createMember(Member member) { em.persist(member); ScheduleExpression membersBirthday = new ScheduleExpression() .dayOfMonth(member.getBirthDay()) .month(member.getBirthMonth()); timerService.createCalendarTimer (membersBirthday, new TimerConfig(member, true)); return member; } // 次頁へ続く 5/9/2012 Beginning JavaEE6 勉強会(3) 23
  • 24. タイマサービス // 前頁から続き // タイマが切れたときにEメールを送信 @Timeout public void sendBirthdayEmail(Timer timer) { Member member = (Member) timer.getInfo(); // Eメール送信処理 } } 5/9/2012 Beginning JavaEE6 勉強会(3) 24
  • 25. 第8章 コールバックと インターセプタ 5/9/2012 Beginning JavaEE6 勉強会(3) 25
  • 26. コールバックとインターセプタ  コールバック  Beanの状態遷移が起きる際に任意のメソッドを呼び 出すこと  Beanごとに設定する  インターセプタ  AOPと同様の機能  Beanのメソッドを呼び出す際に、別のメソッドを呼 び出し割り込み処理を行う  複数のBeanに対して横断的に設定できる 5/9/2012 Beginning JavaEE6 勉強会(3) 26
  • 27. コールバック  ステートレスBean、シングルトンBeanのライフ サイクル 存在しない状態 1.インスタンス生成 5.@PreDestroy呼出し 2.依存性注入 3.@PostConstruct呼出し 準備状態 4.メソッド呼出し 5/9/2012 Beginning JavaEE6 勉強会(3) 27
  • 28. コールバック  ステートフルBeanのライフサイクル 7.タイムアウト 存在しない状態 8.@Removeおよび 1.インスタンス生成 @PreDestroy呼出し 2.依存性注入 3.@PostConstruct 呼出し 6.@PostActive呼出し 準備状態 非活性化状態 5.@PrePassive呼出し 4.メソッド呼出し 5/9/2012 Beginning JavaEE6 勉強会(3) 28
  • 29. コールバック @Stateful public class CartEJB { @Resource private DataSource ds; private Connection conn; @PostConstruct @PostActivate private void init() throws SQLException { conn = ds.getConnection(); } @PreDestroy @PrePassivate private void close() throws SQLException { conn.close(); } 5/9/2012 Beginning JavaEE6 勉強会(3) 29
  • 30. コールバックメソッド  引数なしのvoidメソッドであること  チェック例外のスロー不可、実行時例外は可  アクセス修飾子はすべて使用可  static、finalは不可  1メソッドに複数のアノテーションを指定可  同じアノテーションを2度以上指定不可 5/9/2012 Beginning JavaEE6 勉強会(3) 30
  • 31. インターセプタ  AroundInvokeインターセプタ  Beanごとに適用  Bean内のすべてのメソッドに対して適用される  クラス・インターセプタ  複数のBeanに横断的に適用  インターセプト用のクラスを定義  ライフサイクル・インターセプタ  コールバックの機能を複数のBeanに横断的に適用 5/9/2012 Beginning JavaEE6 勉強会(3) 31
  • 32. AroundInvokeインターセプタ @Stateless public class MemberEJB { public Member findMemberById(Long id) { ... } public Member createMember(Member member) { ... } @AroundInvoke private Object recordLog(InvocationContext ic) throws Exception { // メソッド呼び出し前ログ書き込み処理 try { return ic.proceed(); finally { // メソッド呼び出しログ書き込み処理 { 5/9/2012 Beginning JavaEE6 勉強会(3) 32
  • 33. AroundInvokeインターセプタの定義 @AroudInvoke @AroudInvoke Object <メソッド名>(InvocationContext ic) ic) Object <メソッド名>(InvocationContext throws Exception; throws Exception;  引数はjavax.interceptor.InvocationContext型  戻り値はObject型  チェック例外をスロー可  アクセス修飾子はすべて使用可  static、finalは不可  proceedメソッドでビジネスメソッドを呼び出 し、結果を返す  ただしチェーン内に次のインターセプタメソッドが ある場合はそのインターセプタメソッドを呼び出す 5/9/2012 Beginning JavaEE6 勉強会(3) 33
  • 34. クラス・インターセプタ public class LoggingInterceptor { @AroundInvoke private Object recordLog(InvocationContext ic) throws Exception { // メソッド呼び出し前ログ書き込み処理 try { return ic.proceed(); finally { // メソッド呼び出しログ書き込み処理 { { 5/9/2012 Beginning JavaEE6 勉強会(3) 34
  • 35. クラス・インターセプタ @Stateless public class MemberEJB { @Interceptors(LoggingInterceptor.class) public Member findMemberById(Long id) { ... } public Member createMember(Member member) { ... } } 5/9/2012 Beginning JavaEE6 勉強会(3) 35
  • 36. クラス・インターセプタ  インターセプタとする任意のクラスのメソッド に@AroundInvokeアノテーションを使用  インターセプタを適用したいメソッドまたはク ラスに@Interceptorsアノテーションを使用  メソッドに指定すると指定したメソッドのみイン ターセプタを適用する  クラスに指定するとクラス内のすべてのメソッドに インターセプタを適用する  特定のメソッドのみをインターセプタ適用外とする場合は @ExcludeClassInterceptorsアノテーションを用いる 5/9/2012 Beginning JavaEE6 勉強会(3) 36
  • 37. ライフサイクル・インターセプタ public class LoggingInterceptor { @PostConstruct private void init() { // 初期化処理 { { 5/9/2012 Beginning JavaEE6 勉強会(3) 37
  • 38. ライフサイクル・インターセプタ @Stateless @Interceptors(LoggingInterceptor.class) public class MemberEJB { public Member findMemberById(Long id) { ... } public Member createMember(Member member) { ... } } 5/9/2012 Beginning JavaEE6 勉強会(3) 38
  • 39. ライフサイクル・インターセプタ  Beanのライフサイクルに応じたコールバックを 複数のBeanを横断的に適用可能  @PostConstruct, @PrePassivate, @PostActiva te, @PreDestroyが指定可能  インターセプタを適用したいクラスに @Interceptorsアノテーションを使用 5/9/2012 Beginning JavaEE6 勉強会(3) 39
  • 40. 第9章 トランザクションと セキュリティ 5/9/2012 Beginning JavaEE6 勉強会(3) 40
  • 41. EJBでのトランザクションサポート  コンテナ管理トランザクション(CMT)  トランザクションの開始、コミット、ロールバック をコンテナが自動的に管理  なにも設定しない時のデフォルトの動作  Bean管理トランザクション(BMT)  トランザクションの開始、コミット、ロールバック をBean内に明示的に記述 2012/5/16 Beginning JavaEE6 勉強会(3) 41
  • 42. コンテナ管理トランザクション(CMT) @Stateless public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; public Member createMember(Member member) { em.persist(member); return member; } } 5/9/2012 Beginning JavaEE6 勉強会(3) 42
  • 43. CMTの属性  クライアントがトランザクション対応のメソッ ドを呼び出すときに、そのメソッドがトランザ クション内で呼び出されているか否かによっ て、以下の4つうちどの動作をするかを設定で きる  コンテナがクライアントのトランザクションを利用 する  新しいトランザクションを開始してメソッドを実行 する  トランザクションを使用しないでメソッドを実行す る  例外をスローする  クラスやメソッドに@TransactionAttributeを 5/9/2012 Beginning JavaEE6 勉強会(3) 43
  • 44. CMTの属性 CMT属性 トランザクション内でない トランザクション内 REQUIRED 新しいトランザクション 呼出し元のトランザクション REQUIRED_NEW 新しいトランザクション 新しいトランザクション SUPPORTS トランザクションを使用し 呼出し元のトランザクション ない MANDATORY 例外 呼出し元のトランザクション NOT_SUPPORTED トランザクションを使用し トランザクションを使用しな ない い NEVER トランザクションを使用し 例外 ない 5/9/2012 Beginning JavaEE6 勉強会(3) 44
  • 45. CMTの属性 @Stateless @TransactionAttribute (TransactionAttributeType.SUPPORTS) public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; public Member createMember(Member member) { em.persist(member); return member; } } 5/9/2012 Beginning JavaEE6 勉強会(3) 45
  • 46. CMTのロールバック  デフォルトでは非チェック例外が発生した場合 のみトランザクションがロールバックされる  明示的にトランザクションをロールバックする にはDIによりSessionContextを取得し setRollBackOnly()メソッドを呼び出す 5/9/2012 Beginning JavaEE6 勉強会(3) 46
  • 47. CMTのロールバック @Stateless public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; @Resource private SessionContext ctx; public Member createMember(Member member) { if (member.isValidMember) { ctx.setRollBackOnly(); } em.persist(member); return member; } } 5/9/2012 Beginning JavaEE6 勉強会(3) 47
  • 48. 例外処理  デフォルトでは非チェック例外が発生した場合 のみトランザクションがロールバックする  ユーザ例外クラスに@ApplicationExceptionを 付加することでチェック例外/非チェック例外 に関わらず、ロールバックの有無を設定可能 5/9/2012 Beginning JavaEE6 勉強会(3) 48
  • 49. 例外処理 @Stateless public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; @Resource private SessionContext ctx; public Member createMember(Member member) throws MemberInvalidException { if (member.isValidMember) { throw new MemberInvalidException(); } em.persist(member); return member; } } 5/9/2012 Beginning JavaEE6 勉強会(3) 49
  • 50. 例外処理 @ApplicationException(rollback = true) public class MemberInvalidException extends Exception { public MemberInvalidException() { } public MemberInvalidException(String message) { super(message); } } 5/9/2012 Beginning JavaEE6 勉強会(3) 50
  • 51. Bean管理トランザクション(BMT)  Beanのメソッド内に明示的にトランザクション の開始・コミット・ロールバックを記述  @TransactionManagementアノテーションをBean クラスに付加するとBean管理のトランザクショ ンとなる  DIによりUserTransactionのインスタンスを生 成し、begin(), commit(), rollback()メソッ ドによりトランザクションの操作を行う 5/9/2012 Beginning JavaEE6 勉強会(3) 51
  • 52. Bean管理トランザクション(BMT) @Stateless @TransactionManagement( TransactionManagementType.BEAN) public class MemberEJB { @PersistenceContext(unitName = "sample") private EntityManager em; @Resource private UserTransaction ut; public Member createMember(Member member) { ut.begin(); em.persist(member); if (member.isValidMember) { ut.rollback(); } ut.commit(); return member; } 5/9/2012 Beginning JavaEE6 勉強会(3) 52
  • 53. セキュリティ  プリンシパルのロールごとにBean全体または一 部メソッドのアクセスを制御することができる  プリンシパル  認証を行ったユーザのユーザ名  making  kjstylepp  inatus など  ロール  プリンシパルごとに割り当てられるグループ名  Employee  Admin  User など 5/9/2012 Beginning JavaEE6 勉強会(3) 53
  • 54. 宣言型のセキュリティ  アノテーションをBeanクラスまたはメソッドに 付加し、アクセスを制御する  @PermitAll  すべてのロールにアクセス許可を与える  @DenyAll  すべてのロールからのアクセスを拒否する  特定の環境でメソッドへのアクセスを拒否する場合 などに利用する  @RollsAllowed  リストに指定されているロールにアクセス許可を与 える 5/9/2012 Beginning JavaEE6 勉強会(3) 54
  • 55. 宣言型のセキュリティ @Stateless @RolesAllowed({“user”, “employee”, “admin”}) public class MemberEJB { @PermitAll public Member findMemberById(Long id) { ... } public Member createMember(Member member) { ... } @RolesAllowed(“admin”) public void deleteMember(Member member) { ... } @DenyAll public Member findConfidentialMember(Long id) { ... } 5/9/2012 Beginning JavaEE6 勉強会(3) 55
  • 56. プログラムによるセキュリティ  以下の場合に用いる  メソッド内のコードのブロックにアクセスを許可ま たは拒否をする場合  個人へのアクセス許可または拒否をする場合  DIでSessionContextのインスタンスを生成し、 以下のメソッドを用いる  isCallerInRole():指定したロールであるかを判定 しboolean値を返す  getCallerPrincipal():Principalオブジェクト返 す  Principal.getName()でプリンシパルの名前を取得可能 5/9/2012 Beginning JavaEE6 勉強会(3) 56
  • 57. 宣言型のセキュリティ @Stateless @RolesAllowed({“user”, “employee”, “admin”}) public class MemberEJB { @resource SessionContext ctx; public Member findMemberById(Long id) { if (ctx.isCallerInRole(“user”) { // 本の検索処理 } if (ctx.getCallerPrincipal().getName() .equals(“inatus”) { return findConfidentialMember(id); } ... } 5/9/2012 Beginning JavaEE6 勉強会(3) 57