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