InfoQ

News

イベント・モデルでGrailsアプリケーションの振る舞いをカスタマイズする

作者 Srini Penchikala, 翻訳者 渡嘉敷 満理子 投稿日 2008年10月12日 午後6時39分

コミュニティ
Java
トピック
動的言語
タグ
Grails,
Groovy

一般的なGrails(リンク)アプリケーションは、ビルド・プロセスかあるいはドメイン・クラス(リンク)やコントローラ(リンク)といった個々のアーティファクトかは問わず、アプリケーション・ライフサイクルの重要なポイントでイベントをスローする。アプリケーション・イベントはリスナがそのイベントを遮断し(リンク)、カスタムの振る舞いでイベントに対応するよう設定するのに適した拡張ポイントと言える。HTTPリクエストおよびレスポンスの標準的なWebアプリケーション・ライフサイクルに加え、Grailsには、開発者がイベント・モデルを利用しカスタムな振る舞いを提供するためのカスタム・タッチポイントが多く用意されている。これらのタッチポイントには以下のものが含まれている。

  • ビルド・プロセス中にスローされるイベント
  • アプリケーションの起動および停止
  • Grailsドメイン・クラスのライフサイクル・イベント

バージョン0.5から利用可能であるGant(リンク)スクリプト向けのイベント・ハンドラは、Grailsターゲットおよびプラグイン・スクリプトの実行中にトリガーされる。Events.groovyスクリプトの一連のクロージャ(Grailsの他のすべてのもの)として実装され、「event」で始まる名前で定義される。Grantスクリプトで対応する「イベント」が発生したとき、イベントのクロージャは呼び出される。Grailsは以下のロケーションでこれらのスクリプトを検索する。

  • USER_HOME/.grails/scripts - user-specific event handlers
  • PROJECT_HOME/scripts - applicaton-specific event handlers
  • PROJECT_HOME/plugins/*/scripts - plugin-specific event handlers

Grailsのイベント処理(リンク)はマクロおよびマイクロ・レベルで管理できる。マクロ・レベルとはビルドおよびアプリケーションの規模である。マイクロ・レベルのイベントはドメイン・レイヤで発生し、ドメイン・クラスがデータベースと対話するたびにイベントを発行する。 Scott Davis氏(リンク)は近ごろGrailsイベント・モデルについて、またデベロッパがアプリケーションの振る舞いをさらにカスタマイズする際に、Grailsアプリケーション・ライフサイクルを通じたイベントがどのように役に立つのかについて書いた(リンク)。 デベロッパは、Events.groovyファイルを作成し、それにカスタム・コードを置くことで、標準Grailsスクリプトを修正せずに、ビルド・プロセスを拡張することができる。

ビルド・イベント:

「grails create-app」および「grails run-app」(または「grails war」)コマンド間のビルド・プロセスのすべてのステップには、重要なポイントでスローされるイベントがある。リスナを作成することで、これらのビル・ドイベント(リンク)をプロジェクトで利用することができる。これらのイベントは、インストール後の構成およびアプリケーション・アップグレードでも使用することができる。(カスタムイベントをスローするために)GRAILS_HOME/スクリプトでスクリプトをカスタマイズする場合、カスタム・スクリプトが他のものと一緒にソース・コントロールにチェックインするように、これらのファイルをプロジェクトのスクリプト・ディレクトリに直接コピーすることを、Scott氏は提言している。

アプリケーション・イベント:

ビルド・イベントの他に、アプリケーション・ロジックのカスタマイズにアプリケーション・イベントも利用可能である。grails-app/confにあるBootStrap(リンク)ファイルは、Grailsの起動および停止のたびに実行される。BootStrapファイルのinitクロージャは起動時に呼び出され、destroyクロージャはアプリケーションがシャットダウンされる際に呼び出される。init イベントおよびdestroyイベントの両方が発生した場合、デバッグ・メッセージを確認するには次のように入力しGrailsを対話モードで起動する。

grails interactive" 

アプリケーション・イベントの拡張の例は、ブートストラップ時、データベースに新たなレコードを追加することである。Scott氏は、データベースでの重複レコードを避けるために、BootStrap.groovyにおけるFailsafeデータベースの挿入および削除について述べた。また、GrailsUtil(リンク)クラスを使用して、Bootstrapスクリプトでの環境固有の(Development、TestまたはProduction)アクションについて説明した。 スクリプトの上部にあるgrails.util.GrailsUtilをインポートして、静的メソッドGrailsUtil.getEnvironment() (Groovyの簡潔なgetter構文が理由で、GrailsUtil.を簡略化するためにメソッドは省略可能)を呼び出し、実行しているモードを確認することができる。 

ドメイン・クラス・イベント:

CRUD操作の4つのイベント・フックが含まれる。 onLoad、beforeInsert、befortUpdateおよびbeforeDeleteであり、データベース操作が呼び出されたときにトリガーされる。

  • onLoadはデータベースからクラスがロードされる際に呼び出される。
  • beforeInsertクロージャはsave()メソッドの前に呼び出される。
  • beforeUpdateクロージャはupdate()メソッドの前に呼び出される。
  • beforeDeleteクロージャはdelete()メソッドの前に呼び出される。

上記イベントを補強するために、GrailsはGORMイベント(リンク)とHibernateプラグイン(リンク)をサポートしている。GORMイベントのカスタマイズには、削除、挿入、更新といった特定イベントの発生とともに発生するイベントの登録も含まれる。Hibernateイベント・プラグインにより、メソッド(AfterInsert、afterUpdate、afterDelete、beforeLoad、afterLoad、beforeSave、およびafterSave)を使用してhibernateイベント・システムと連携するためのドメイン・モデルが強化された。他のドメイン・レイヤ・イベントにドメイン・クラスのタイムスタンプがある。具体的な名前付きフィールドをいくつか(lastUpdatedおよびateCreated)設定すると、GORM(リンク)は自動的にクラスのタイムスタンプを取得する。

Webアプリケーションの他のレイヤでは、GrailsはWebフローを実行するトランザクションをある状態から別の状態へ(ビューの状態またはアクション状態が該当する)管理するためにWeb Layer Flow Execution Event(リンク)を提供している。また、Webアプリケーションで特定のイベントが発生した際に、明確なjavascript関数を呼び出すためのAjax Event(リンク)も用意されている。

GrailsはAuto Reload Event(リンク)の抑止もサポートしている。このイベントはあらゆるデータ変更のリソース監視、および変更が発生した際のリロードに使用される。このようにしてGrailsでは実行時のアプリケーション状態のリロードが実装されている。

原文はこちらです:http://www.infoq.com/news/2008/09/grails-event-model

ブックマーク
digg+,
reddit+,
del.icio.us+,
dzone+,
Hatena

No comments

返信

ジャンル別一覧

Agile2008 チーム参加レポート - 動機/準備編

筆者はアジャイルソフトウェア開発についての年に一度の国際会議であるAgile2008に初めて参加してきました。今年の日本からの参加者の数は14名にも及び、発表者は5名、受け持ったセッションは8つに及び、例年にない活躍を見せました。なぜ今年のAgile2008では、これほど多くの日本人が参加し発表に至ったのか? そのレポートをお届けします。

Javaトラブルシューティングメルマガ総集編 2008/08~09

エスエムジーでは、Java全般を対象にしたトラブルシューティングサービス「JaTS」を提供しています。この記事では、前回に引き続き、JaTSにて蓄積したトラブル事例とその解決ノウハウの一部をお送りしている「Javaトラブルシューティングメールマガジン」(JTSMM)の総集編として、過去2ヶ月のトラブル事例と追加情報をダイジェストとして提供いたします。

モデル駆動アプローチがうまく機能しない(しなくなる)8 つの理由

この記事では、モデル駆動アプローチがうまく機能しない、または機能しなくなることによって期待した結果が実現できなくなる 8 つの理由について書きたいと思います。

消費者主導契約を使ったサービス指向開発

この論文では、組織のサービス開発能力改善を目指した実用的な提案をします。

スケーラビリティの構築とパフォーマンスの達成:バーチャルパネル

InfoQ.com向けのこのバーチャルパネルでは、大企業やプロジェクトからスケーラビリティやパフォーマンスの著名人を招待し、みんなが夢に描いているような結果を達成するための秘密を明かしてもらいました。

アジリティのためにコンポーネントチームより機能チームを選ぶ

Craig Larman氏とBas Vodde氏は、どのように、そして、なぜ機能チームがうまくいくのかを説明し、この主要な組織の変化が価値あるものであることを主張します。

仮想化とセキュリティ

仮想化にはたくさんの利点がありますが、かと言って、その上に実装するアプリケーションのセキュリティをないがしろにしてはいけないのです。

Rubyのオープンクラス:猿のようにパッチを当てない方法

最近リリースされたRuby 1.8.7のプレビューリリースをウオッチしていたRails開発者はすぐに1.8.7プレビュー1に関してあることに気がつきました。それは、1.8.7プレビュー1がRailsを破壊してしまうということです。