SlideShare a Scribd company logo
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

KEY
Beginning Java EE 6 勉強会(4) #bje_study
PPTX
Beginning Java EE 6 勉強会(1) #bje_study
PPTX
Beginning Java EE 6 勉強会(6) #bje_study
PDF
Java Batch 仕様 (Public Review時点)
PPTX
Java EE8 Report
PDF
Java EEの話(仮)
PPTX
Java EE パフォーマンスTips #glassfish_jp
PPT
Spring3.1概要 データアクセスとトランザクション処理
Beginning Java EE 6 勉強会(4) #bje_study
Beginning Java EE 6 勉強会(1) #bje_study
Beginning Java EE 6 勉強会(6) #bje_study
Java Batch 仕様 (Public Review時点)
Java EE8 Report
Java EEの話(仮)
Java EE パフォーマンスTips #glassfish_jp
Spring3.1概要 データアクセスとトランザクション処理

What's hot (20)

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

Viewers also liked (6)

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

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

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

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