Java > JavaEE > EnterpriseBeans > RunEnterpriseBeans

The cart Example


A Singleton Session Bean Example: counter

  • シングルトンセッションビーンの初期化
    • @Startup :アプリケーション起動時にインスタンス生成
      • アプリケーションの起動時のタスクを実装できる
    • @Startup:EJBコンテナ次第
  • 複数のシングルトンセッションビーンの初期化順序は@DependsOnで指定
    • @DependsOnに複数のビーン名を指定する場合は、指定順序と初期化順序は必ずしも一致しない

Managing Concurrent Access in a Singleton Session Bean

  • シングルトンセッションビーンの同時アクセス制御は2パターン
    • @ConcurrencyManagementで指定 ( CONTAINER |BEAN)

Container-Managed Concurrency

  • シングルトンのビジネスメソッドまたは@Timeoutメソッドへのアクセスをコンテナが管理する
  • @Lock(LockType.READ)
    • 複数のクライアントから同時にアクセス可能
  • @Lock(LockType.WRITE)
    • 1クライアントのみ同時にアクセス可能(他のメソッドもロックされる)
    • クライアントがシングルトンの状態を変える時など
  • クラスレベルで@Lockを指定すると、全ビジネスメソッド、@Timeoutメソッドに適用可能
    • メソッドレベルの指定で上がかれる
  • @Lockの指定がなければデフォルトは@Lock(LockType.WRITE)
  • クライアントのアクセスがブロックされてタイムアウトになったらConcurrentAccessTimeoutExceptionが発生
  • タイムアウトになるまでの時間を@AccessTimeoutで指定(クラス or メソッド)

Bean-Managed Concurrency

  • 開発者がビジネスメソッド、@Timeoutメソッドの同期を用意する

Handling Errors in a Singleton Session Bean

  • シングルトンセッションビーンが初期化時にエラーになったら、インスタンスは破棄される
  • シングルトンセッションビーンが正常に初期化されたら、シングルトンのビジネス、ライフサイクルメソッドがシステム例外を発生させない限り、インスタンスは破棄されない

A Web Service Example: helloservice

The Web Service Endpoint Implementation Class

  • Webサービスエンドポイント実装に必要なこと
    • @WebServiceまたは@WebServiceProviderをクラスに付与
    • 実装クラスは@WebServiceのendpointInterfaceでSEIを指定(任意)
      • endpointInterface指定がない場合は、実装クラスで暗黙的に定義
    • ビジネスメソッドはpublicでfinalとstaticは不可
    • ビジネスメソッドには@WebMethodをつける
    • ビジネスメソッドのパラメータと戻り値はJAXB互換性が必要
    • 実装クラスはfinal,abstract不可
    • 実装クラスはデフォルトpublicコンストラクタが必要
    • エンドポイントクラスは@Statelessを付加
    • 実装クラスはfinalizeメソッドを持たない
    • 実装クラスはライフサイクルイベントコールバックに@PostConstruct,@PreDestroyメソッドを定義
      • *The cart Example

A Singleton Session Bean Example: counter

  • シングルトンセッションビーンの初期化
    • @Startup :アプリケーション起動時にインスタンス生成
      • アプリケーションの起動時のタスクを実装できる
    • @Startup:EJBコンテナ次第
  • 複数のシングルトンセッションビーンの初期化順序は@DependsOnで指定
    • @DependsOnに複数のビーン名を指定する場合は、指定順序と初期化順序は必ずしも一致しない

Managing Concurrent Access in a Singleton Session Bean

  • シングルトンセッションビーンの同時アクセス制御は2パターン
    • @ConcurrencyManagementで指定 ( CONTAINER |BEAN)

Container-Managed Concurrency

  • シングルトンのビジネスメソッドまたは@Timeoutメソッドへのアクセスをコンテナが管理する
  • @Lock(LockType.READ)
    • 複数のクライアントから同時にアクセス可能
  • @Lock(LockType.WRITE)
    • 1クライアントのみ同時にアクセス可能(他のメソッドもロックされる)
    • クライアントがシングルトンの状態を変える時など
  • クラスレベルで@Lockを指定すると、全ビジネスメソッド、@Timeoutメソッドに適用可能
    • メソッドレベルの指定で上がかれる
  • @Lockの指定がなければデフォルトは@Lock(LockType.WRITE)
  • クライアントのアクセスがブロックされてタイムアウトになったらConcurrentAccessTimeoutExceptionが発生
  • タイムアウトになるまでの時間を@AccessTimeoutで指定(クラス or メソッド)

Bean-Managed Concurrency

  • 開発者がビジネスメソッド、@Timeoutメソッドの同期を用意する

Handling Errors in a Singleton Session Bean

  • シングルトンセッションビーンが初期化時にエラーになったら、インスタンスは破棄される
  • シングルトンセッションビーンが正常に初期化されたら、シングルトンのビジネス、ライフサイクルメソッドがシステム例外を発生させない限り、インスタンスは破棄されない

A Web Service Example: helloservice

The Web Service Endpoint Implementation Class

  • Webサービスエンドポイント実装に必要なこと
    • @WebServiceまたは@WebServiceProviderをクラスに付与
    • 実装クラスは@WebServiceのendpointInterfaceでSEIを指定(任意)
      • endpointInterface指定がない場合は、実装クラスで暗黙的に定義
    • ビジネスメソッドはpublicでfinalとstaticは不可
    • ビジネスメソッドには@WebMethodをつける
    • ビジネスメソッドのパラメータと戻り値はJAXB互換性が必要
    • 実装クラスはfinal,abstract不可
    • 実装クラスはデフォルトpublicコンストラクタが必要
    • エンドポイントクラスは@Statelessを付加
    • 実装クラスはfinalizeメソッドを持たない
    • 実装クラスはライフサイクルイベントコールバックに@PostConstruct,@PreDestroyメソッドを定義
      • @PostConstructは実装クラスがクライアントにレスポンスを返す前に呼ばれる
      • @PreDestroyはエンドポイントがオペレーションから削除される前に呼ばれる

Using theTimer Service

  • タイマーサービスを使うと、ステートフルセッションビーン以外のエンタープライズビーンに対して、タイマー通知を実装できる
    • カレンダースケジュール
    • 特定の時刻
    • 一定時間後
    • 一定期間で
  • プログラマティックタイマー
    • TimeerServiceの生成メソッドを呼ぶことで、明示的にタイマーを設定
  • 自動タイマー
    • エンタープライズビーンに@Scheduleまたは@Schedulesを付与

Creating Calendar-BasedTimer Expressions

  • Unixのcronのように記述することで、カレンダーのタイマーを設定
    second 0-59
    minute 0-59
    hour 0-23
    dayOfWeek 0-7,[Sun, Mon, Tue, Wed, Thu, Fri, Sat]
    dayOfMonth 1-31,-1--7,[1st, 2nd, 3rd, 4th, 5th, Last] [Sun, Mon, Tue, Wed, Thu, Fri, Sat]
    month 1-12,[Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec]
    year 9999

Specifying Multiple Values in Calendar Expressions

  • ワイルドカード(*)で任意の値
  • カンマ区切りで複数の値
    • 値の範囲も指定可能(9-17など)
    • ワイルドカードと期間は使用不可
  • ハイフン(-)で値の範囲を指定
    • ワイルドカード、リスト、期間は使用不可
    • x-x = x
    • x-y (x > y) (ex.9-1 = 9-23,0-2)
  • /で期間指定
    • x/y:xは開始、yは期間
    • */y = 0/y

Programmatic Timers

  • プログラマティックタイマーが来たら、ビーンの@Timeoutメソッドが呼ばれる

@Timeoutメソッド

  • publi void xxx([Timer timer])

Creating Programmatic Timers

  • TimerServiceインターフェースの生成メソッドを利用
    • シングルアクションタイマー
    • インターバルタイマー
    • カレンダータイマー
  • シングルアクション、インターバルタイマーの場合は、タイマー切れまでのミリ秒数か絶対時刻を指定する
    timerService.createSingleActionTimer(60000, new TimerConfig());
    timerService.createSingleActionTimer(date, new TimerConfig());
    
  • カレンダータイマーの場合は、ScheduleExpressionを指定する
    timerService.createCalendarTimer(schedule);
    
  • タイマーはデフォルトでは永続化される
    • サーバがシャットダウン(またはクラッシュ)した時に保存され、再起動時にアクティブになる
    • サーバダウン中にタイマー切れした場合は、再起動時に@Timeoutメソッドが呼ばれる
  • タイマーを永続化しない場合は、TimerConfig.setPersistent(false)のTimerConfigを渡す
  • タイマーはリアルタイム処理には向かない
    • 時間、日単位以上の期間での処理に向く

Automatic Timers

  • @Schedule または @Schedulesメソッドが定義されたエンタープライズビーンがデプロイされたらタイマーがEJBコンテナによって生成される
  • 自動タイマーの場合は、複数のメソッドをエンタプライズビーンに定義できる
    • @Timeoutメソッドはエンタプライズビーンに1つのみ定義可能
  • 自動タイマーはビーンのアノテーションまたは、ejb-jar.xmlに指定
  • @Scheduleでタイムアウトメソッドを定義
    • persistent:タイマーを永続化するか(デフォルトはtrue)
    • timezone:タイマー時刻を判定するタイムゾーン(デフォルトはサーバのデフォルトタイムゾーン)
    • info:タイマーの情報記述。Timer.getInfo()で取得可能
  • 複数のカレンダータイマーを指定するために@Schedulesを利用

Canceling and Saving Timers

  • タイマーをキャンセルするイベント
    • コンテナがシングルイベントタイマーのタイムアウト処理を実行した後。
    • ビーンがTimer.cancelを実行したとき
  • キャンセルされたタイマーが起動されたとき、NoSuchObjectLocalException
  • タイマーオブジェクトを保存して、将来使うことができる
    • Timer.getHandleでTimerHandleオブジェクトを取得しDBに保存
    • DBからTimerHandleオブジェクトを取得し、TimerHandle.getTimerでTimerを取得
  • TimerHandleオブジェクトはリモートインターフェースのパラメータで受け渡せない
    • リモートクライアントやWebサービスクライアントはTimerHandleにアクセスできない

Getting Timer Information

  • getTimeRemaining()
  • getNextTimeout()
  • getInfo()
  • TimerService.getTimers():すべてのビーンのアクティブタイマーを取得する

Transactions and Timers

  • トランザクションがロールバックされるときタイマー生成もロールバックされる
  • トランザクションがロールバックされるときタイマーキャンセルもロールバックされる
  • コンテナ管理トランザクションを利用しているビーンでは、@TimeoutメソッドはRequiredまたはRequiresNewのトランザクション属性
    • コンテナは、@Timeoutメソッドをコールする前に新規トランザクションを開始
    • トランザクションがロールバックされたら、@Timeoutメソッドがもう一度よばれることになる

Handling Exceptions

  • エンタプライズビーンがthrowする例外はシステム例外とアプリケーション例外に分類される
  • EJBコンテナはトランザクションをシステム例外の場合はロールバックし、アプリケーション例外の場合はロールバックしない
  • システム例外
    • アプリケーションの土台のサービスの問題
      • 外部リソースへのコネクションエラー
      • インジェクトされたリソースが見つからない
    • EJBExceptionをthrowするべき
      • EJBコンテナはビーンのインスタンスを破棄する
      • クライアントでは解決できず、システム管理者の作業が必要
  • アプリケーション例外
    • エンタープライズビーンのビジネスロジックエラー
    • アプリケーション固有の例外
      • EJBコンテナは別の例外でラップしない
      • クライアントは例外ハンドリングする
最終更新:2012年09月17日 13:48
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。