はじめに
この連載では、「オープンソースApache Tuscanyで楽しむSOA」として、オープンソースのSCA準拠製品である「Apache Tuscany」を取り上げ、SOA(サービス指向アーキテクチャ)の開発について説明していきたいと思います。第7回目の今回は、サービスの実装に他の言語を使用する方法を説明します。
これまでの連載
- 第1回「Apache Tuscanyの紹介」
- 第2回「Apache Tuscanyの環境設定」
- 第3回「Web2.0から始めましょう(JSONRPC編)」
- 第4回「Web2.0から始めましょう(Atom編)」
- 第5回「Webサービスでコンポーネント同士をワイヤリングしましょう」
- 第6回「WSDLを使用してWebサービスでワイヤリングしましょう」
Rubyを簡単にサービス化
前回まではJSONRPC、Atom、Webサービスなど通信プロトコルがサービスの実装から独立していること(プロトコル中立)を説明してきました。これだけでも非常にインパクトのあることです。今回はサービスの実装に他の言語を使用する方法を説明します。
TuscanyはJRuby、Jython、Groovyなどのスクリプト言語をはじめ、XSLTやXQueryも使用可能です(言語中立)。JRuby以外は趣味でプログラミングの経験があり、ある程度は知っているのですが、今回は言語の紹介が目的ではないため、あえて何も知らないJRubyで挑戦したいと考えています。目標は、CalcChargeImpl以外のインターフェースや実装には一切手を加えず、CalcChargeImplをJavaからJRubyに切り替えることです。
個人的な希望ですが、Scalaこそコンポーネントを作成するのに向いている言語なのではと考えています。早くScalaがTuscanyでサポートされることを願っています。もしくはどなたかTuscanyで言語をサポートする仕方を教えていただければ、私自身でScalaをTuscanyでサポートしたいとも考えています。他人に頼るなという声も聞こえてきそうなので、言語のサポートの仕方を調査し、いずれ報告できればと思います。
戻り値だけは要注意
JRubyでサービスを実装すると言っても、前回までで説明したとおりコードの中にプロトコルに関する実装を記述する必要がないのと同様、Tuscanyのための実装やプロトコルに関する実装を記述する必要はありません。従って、Javaの代りにJRubyで記述するという違いだけです。ただし、インターフェースをJavaで記述する場合、JRubyはインターフェースの戻り値と同じになるよう注意する必要があります。
第1回「Apache Tuscanyの紹介」では依存性注入で他の言語を使用すると記述しましたが、Tuscanyの1.5ではその必要さえありません(内部では使用しているのかもしれませんが、開発者には意識させないようになりました)。CalcChargeを呼び出すBasketImplでReference
アノテーションを使うだけでCalcChargeを実装したコンポーネントを呼び出すことができます。以前のバージョンでは、依存性注入でJRubyやGroovyを呼び出さなくてはならなかったことを考えると非常にシンプルになりました。最初はCalcChargeのsetter
メソッドをBasketImplに追加して動作させていたのですが、これでは当初の目標を達成できません。試しに、前回のコードに戻したところ、正常にCalcChargeを呼び出すことができました。これで、呼び出される言語(JRuby)に応じて呼び出し側の実装(Java)に手を加えなくても大丈夫になったわけです。