第5回 Ruby on Geronimoを試す【前編】Apacheの戦士Geronimoが持つ実力(1/2 ページ)

Geronimoでオープンソースミドルウェアの柔軟な統合を実現できるなら、独自のミドルウェアも統合できるはず! 今回は、統合の実例として、近年注目を集めるRubyのランタイム環境をGeronimo上に統合してみます。

» 2007年03月28日 08時30分 公開
[津田嘉孝,ITmedia]

はじめに

 今回は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が管理しているからです。

図1 図1 RoGの全体像

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 RubyGBean.javaの冒頭(一部省略)

1: <configuration ... configId="configure/rubyGBean">
2:   <gbean name="gbean/rubyGBean" class="RubyGBean"/>
3: </configuration>

リスト2 rubyGBean.plan(一部省略)

このページで出てきた専門用語

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言語で書かれたソースコードを呼び出すことができる。


       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ