エンタープライズへの適用 |
|
CORBAについて学習したいと思っても、必要なソフトがないと思っていらっしゃる方も多いのではないかと思います。実は、Javaを使ってCORBAオブジェクトを作るのであれば、特別なソフトは必要ありません。JDK(J2SE)だけがあればいいのです。
ここでは、CORBAそのものについての解説は割愛しますが、J2SEに含まれるJava IDLを使って、簡単なCORBAのサンプルを動作させる手順についてご説明していきます(CORBAやJava IDLについての詳しい解説は、ほかの文献やJ2SE付属のドキュメントなどをご覧ください)。
※ この記事では、Java IDLの仕様はJ2SE 1.4 ベータ版に基づいて解説しています。
■Java IDL
Java IDLとは、CORBAで規定されている、いわゆるInterface Difinition Languageのことだけを指しているのではなく、JDKにバンドルされて提供されるORB(Request Object Broker)などの、いわゆるCORBAオブジェクトの開発、実行環境を提供します。Java IDLには、以下のようなツールが含まれています。
- idlj
CORBAのIDL定義ファイルをJavaに変換したソースを生成するプリプロセッサです。
- orbd
CORBAのORB(Object Request Broker)のデーモンプログラムです。また、それ以外に、ネームサービスも含まれています。このネームサービスは永続的(Persistent)な機能、つまりサービスプロセスをシャットダウンしても、登録したディレクトリ内容を保持できる機能を提供します。
- servertool
CORBAサーバオブジェクトの管理をするためのコンソールベースのツールです。
- tnameserv
orbdの古いバージョンにあたるもので、基本的な機能はorbdと同じです。ただしネームサービスは、一時的(Transient)な機能に限定されており、サービスプロセスをシャットダウンすると、登録したディレクトリ内容は破棄されます。
■Java IDLによる実装の手順
では、Java IDLを使ったCORBAの実装手順についてご説明しましょう。
(1)IDLのコーディング
ここでいうIDLは、CORBAの仕様で規定されているInterface Difinition Languageのことで、Javaのインターフェイス定義によく似ています。IDLでは、クライアントがアクセスすることのできる操作(Javaのメソッドに相当)、例外、型付きの属性を定義することができます。
(2)IDLから、Javaソースへのコンパイル
idljを用いて、IDLをJavaソースに変換します(idljはプリプロセッサなので、Javaのクラスファイルは生成されません)。
(3)サーバアプリケーションの作成
上記で作成されたソースを用いて、サーバントクラスと、ネームサービスにサーバントを登録するための、サーバクラスを作成します。
(4)クライアントアプリケーションの作成
ORBからオブジェクト参照を取得してメソッドを実行するための、クライアントクラスを作成します。
(5)コンパイルと実行
作成したクラスすべてをコンパイルします。実行は、orbdの起動、サーバクラスの実行を順に行い、その後、クライアントクラスを実行します。
■サンプルの作成と実行
では、J2EE付属のドキュメントを参考にして、簡単なサンプルを作成、実行してみましょう。
ここでは、C:\javaに必要なファイルを配置すると仮定します。JavaのCLASSPATHに、このディレクトリもしくはカレントディレクトリをあらかじめ追加しておいてください。また、PATHに、J2SEのbinディレクトリを追加するのも忘れないでください。OSは、Windows NTを想定しています。
(1)IDLのコーディング
作成するCORBAオブジェクトには、「Hello Java IDL World!」という文字列を返す操作を実装します。これをIDLで記述すると、次のようになります。
Hello.idl |
module
HelloMod |
(2)IDLから、Javaソースへのコンパイル
このIDLファイルを、idljコマンドでJavaソースに変換します。DOSプロンプトなどで、
C:\>c: |
と実行します。idljのオプション-fallは、クライアント、サーバ双方のファイルを生成するための指定です(-fclient、-fserverと指定すると、それぞれ、クライアント用、サーバ用のファイルだけが生成されます)。このとき、エラーが出なければ、作成は成功しています。この場合、IDLでmodule名として指定したものが、Javaではパッケージに相当しますので、C:\java\HelloModというディレクトリができていて、そのディレクトリ上には、
HelloMod\HelloPOA.java |
という6つのファイルができていると思います。
(注:J2SE 1.3以前では、ファイルの種類が多少異なります)
(3)サーバアプリケーションの作成
(2)で生成された、HelloPOAを継承したサーバントクラスと、ネームサービスにオブジェクトを登録する処理を行うサーバクラスを作成します。サーバントクラスには、IDLで定義した操作のJavaでの実装を記述していきます。IDLでの操作を、Javaのメソッド定義に変換したものが、HelloOperations.javaなので、これをもとに、サーバントのメソッドを実装していきます。
HelloOperations.java(ダウンロード) |
package
HelloMod; public interface HelloOperations
|
さらに、サーバクラスを作成します。サーバクラス内では、ORBオブジェクトと、サーバントのインスタンスを作成し、ORBオブジェクトを用いて、サーバントのインスタンスをネームサービスに登録します。これにより、クライアントが ネームサービスにアクセスして、サーバントの参照を取得することができるようになります。
HelloServer.java(ダウンロード) |
import
HelloMod.*;
public String
getMessage() {
|
(4)クライアントアプリケーションの作成
クライアントでは、サーバアプリケーションによって登録されたサーバントの参照を取得します。そのサーバントのメソッドを呼び出して結果を取得し、コンソールに表示します。
HelloClient.java(ダウンロード) |
import
HelloMod.*; public class HelloClient
{
//
サーバントのメソッドを呼び出し
|
(5)コンパイルと実行
ここまで作成したクラスを、すべてコンパイルします。ファイルは、以下の8つです。
C:\java\HelloMod\HelloPOA.java
|
コンパイルが成功したら実行してみましょう。orbd、サーバアプリケーションの順に実行し、起動が成功したらクライアントアプリケーションを実行します。
まず、orbdを起動します。コマンドラインには、必ず-ORBInitialPortで、ポート番号を、-ORBInitialHostでホスト名を指定する必要があります。ポート番号は、空いている番号を適当に指定してください。
C:\java>start orbd -ORBInitialPort
1050 -ORBInitialHost localhost |
※もし、すぐにウィンドウが閉じてしまう場合は、起動に失敗しています。ポート番号を変えるなどして、再度実行してみてください。
次に、サーバアプリケーションを実行します。orbdと同じく、コマンドラインにポート番号とホスト名を指定してください。このときの値は、当然、orbdと同じにします。
C:\java>java HelloServer
-ORBInitialPort 1050 -ORBInitialHost localhost |
両方が正常に起動したら、クライアントアプリケーションを実行します。
C:\java>java HelloClient
-ORBInitialPort 1050 -ORBInitialHost localhost |
上の画面のように、コンソールに「Hello Java IDL World!」と表示されれば成功です。せっかくの分散オブジェクトですから、サーバとクライアントを分けて、LAN上のほかのマシンから実行してみても面白いかもしれませんね。
また、参考までに、サーブレットで作ったクライアントのリストも載せますので(とはいいましてもコアな部分はコンソール版と同じですが…)興味がありましたら、こちらも試してみてください(Tomcatで動作確認しています)。
HelloServlet.java(ダウンロード) |
import
java.io.*; import java.util.*; public class HelloServlet
extends HttpServlet { public void
doGet(HttpServletRequest request,HttpServletResponse response) throws
IOException,ServletException { String
message = null; Hello
helloImpl; try{ org.omg.CORBA.Object
objRef = orb.resolve_initial_references("NameService"); String
name = "Hello"; System.out.println("Obtained
a handle on server object: " + helloImpl); }
catch (Exception e) { PrintWriter
out = response.getWriter(); PrintWriter
out = response.getWriter(); |
参考URL:
J2SE 1.4 の Java IDLに関するドキュメント(英語)
http://java.sun.com/j2se/1.4/docs/guide/idl/index.html
J2SE 1.3 の Java IDLに関するドキュメント(日本語)
http://java.sun.com/j2se/1.3/ja/docs/ja/guide/idl/index.html
J2SE 1.4のJava IDLは、1.3からいくつか大きな変更が加わっています。1.3から1.4への変更点は、以下のURLで確認できます。
http://java.sun.com/j2se/1.4/docs/guide/idl/jidlChanges.html
「Java Solution FAQ」 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|