第5回 Ruby on Geronimoを試す【前編】:Apacheの戦士Geronimoが持つ実力(1/2 ページ)
Geronimoでオープンソースミドルウェアの柔軟な統合を実現できるなら、独自のミドルウェアも統合できるはず! 今回は、統合の実例として、近年注目を集めるRubyのランタイム環境をGeronimo上に統合してみます。
はじめに
今回はRuby on Geronimo(RoG)*と称し、近年注目を集めるRubyのランタイム環境をGeronimo上で動かしてみます。Javaの強みにリソース管理やセキュリティ管理能力を持つJ2EE環境が挙げられます。そのJ2EEコンテナであるGeronimoで基盤を固め、その上のアプリケーションをRubyで書いてみることに挑戦します。ここで用いる技術は広範におよびます。JavaやWebアプリケーションだけではないGeronimoの使い方に注目してください。
管理方法の選択肢
GBeanを使ってRubyを管理する場合、考えられる管理方法は次の3つです。
- a JRuby*を使う
- b 別プロセスのRubyの起動/停止を管理する
- c RubyをGeronimoのプロセス上で動かす
aの方法は、GBeanを駆使せずともそのまま動きます。次にbの方法でも、GBeanのdoStart()/doStop()のタイミングでプロセスの起動/停止をするだけで簡単すぎます。本稿では大げさにもRuby on Geronimoとうたっていますから、ここではcの方法で実装します。
RoGでのGBean連携
RoGと名づけた今回のサンプルは、どのようにGBeanを利用しているでしょうか。それを一緒に見ていきましょう。なお、サンプルの全ファイルはこちらで公開していますので、適宜ダウンロードしてください。
本当に困難だったRoGへの道
RoGでは図1で示すようにHelloServiceアプリケーションを管理するHelloGBeanとRubyランタイムを管理するRubyGBeanを用意しています。そして、HelloGBeanはRubyGBeanのinvokeメソッドを使って間接的にHelloServiceを呼び出しています。その理由はRubyランタイム用スレッド*をRubyGBeanが管理しているからです。
RubyGBean
まず、リスト1にRubyGBean.javaの冒頭を示します。1行目で、RubyGBeanがGBeanLifecycleを実装しているのが分かりますが、Invokerも実装しているのが分かると思います。これがGBean間の連携で中心となるインタフェースです。RubyGBeanでは2行目で、委譲先のUniqueThreadInvoker()を生成しています。
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***
このページで出てきた専門用語
Ruby on Geronimo(RoG)
Rubyは言わずと知れた純粋なオブジェクト指向言語。RoGはわたしの冗談に基づく明らかな造語。
JRuby
Java VM上で動作するRubyランタイム環境。
Rubyランタイム用スレッド
RoGではJNI*を経由し、C/C++のソースコードからRubyを使用している。しかし、現状、RubyはC言語に提供するメソッドでマルチスレッドをサポートしていないようで、helloメソッドをコールしたスレッドから直接Rubyをコールするのを避けるため、RubyGBeanが単一のWorkerThreadでRubyへアクセスする管理を担っている。
JNI
Java Native Interfaceの略で、C言語で書かれたソースコードを呼び出すことができる。
Copyright © ITmedia, Inc. All Rights Reserved.