記事ソース: Silicon Valley Power 著者: Mainstay
1. はじめに
EJB (Enterprise JavaBeans) は Java プログラミングの中でも比較的高度な内容であり、Java プログラマが入門レベルからエキスパートレベルに進むための敷居でもあります。 SUN Certified Java Programmer (SCJP) と SUN Certified Java Developer (SCJD) の大きな違いは、SCJP は EJB テストを受けないのに対し、SCJD は受けるということです。電子商取引アプリケーション システムの開発に J2EE プラットフォームを採用する企業が増えているため、EJB 開発は今日の Java プログラマが直面しなければならない問題となっています。
この記事では、まず一般的な分散オブジェクト アプリケーションの基本原理をルーチンで紹介し、その後、基本的なダウンロード、インストール、設定から始まり、徐々に EJB プログラミングの方法を紹介することで、EJB を簡単かつ興味深いものとして学習できます。
2. 代表的な分散オブジェクトプログラム
CORBA であっても RMI であっても、分散オブジェクトを実装するための戦略は似ています。簡単なプログラム例を使用して、分散オブジェクト プログラムの構成をシミュレートできます。
この例では、オブジェクトのプロパティをリモートで要求するプロセスをシミュレートします。ネットワーク上にリモート オブジェクト Dog があり、その名前 (strName) 属性を取得する必要があります。プログラムはクライアント側でスタブ (Dog_Stub) クラスを設定し、サーバー側でスケルトン (dog_Skeleton) クラスを開始します。両方のクラスは Dog_Stub と Dog_Skeleton をソケット経由でリモート通信します。クライアント プログラム DogClient が name 属性を取得するリクエストを Dog_Stub に送信すると、Dog_Stub オブジェクトはメソッド名「getName()」を文字列としてリモート Dog_Skeleton オブジェクトに Socket 経由で送信します。Dog_Skeleton オブジェクトはこの文字列を受信した後、 content は、DogServer オブジェクトの getName() メソッドを実行して Dog の名前を取得し、それを Socket 経由で DogStub オブジェクトに返します。プロセス全体はネットワーク経由で実装されますが、クライアント プログラム DogClient については、実際の Dog オブジェクトがどこにあるか、あるいはこのプロセスがネットワークを通過したことさえ認識していません。認識しているのは、name 属性を取得するリクエストだけです。満足のいく結果が得られました。
実際、CORBA または Java RMI の実装はこれに似ていますが、はるかに単純ではありません。このプログラムは、分散オブジェクト アプリケーションの実行メカニズムを説明するのに役立ちます。
プログラムのソースコードは次のとおりです。
ファイルドッグ.java
パブリックインターフェース犬
{
public String getName() は例外をスローします。
}/* 犬 */
FileDogClient.java
パブリック クラス DogClient
{
public static void main( String[] args ) が例外をスローする
{
犬 犬 = new Dog_Stub();
文字列 strName = Dog.getName();
System.out.println( "名前: " + strName );
}//主要()
}/* ドッグクライアント */
FileDogServer.java
パブリッククラス DogServer は Dog を実装します
{
文字列 strName;
int intAge;
public String getName() が例外をスローする
{
strName を返します。
}//getName()
public DogServer( String strNameInput )
{
strName = strName入力;
}//ドッグサーバー()
public static void main( String[] args ) が例外をスローする
{
New Dog_Skeleton( new DogServer( "TOMCAT" ) );
}//主要()
}/* ドッグサーバー */
ファイル Dog_Skeleton.java
java.io.* をインポートします。
java.net.* をインポートします。
パブリッククラス Dog_Skeleton は Thread を拡張します
{
静的サーバーソケット ss = null;
ドッグサーバーds;
public Dog_Skeleton( DogServer dsInput ) が例外をスローする
{
ds = ds入力;
if(ss==null)
ss = 新しいサーバーソケット(8000);
this.start();
}//犬のスケルトン()
public synchronized void run()
{
試す
{
while ( ss != null )
{
ソケットソケット = ss.accept();
ObjectInputStream ois = 新しい ObjectInputStream(socket.getInputStream() );
ObjectOutputStream oos = 新しい ObjectOutputStream(ソケット.getOutputStream() );
String strMethodName = ( String )ois.readObject();
if ( strMethodName.equals( "getName()" ) )
oos.writeObject( ds.getName() );
oos.flush();
ois.close();
oos.close();
ソケット.クローズ();
}//その間
}//試す
catch(例外 e)
{
e.printStackTrace();
}//キャッチ
}//走る()
}/* 犬のスケルトン */
FileDog_Stub.java
java.io.* をインポートします。
java.net.* をインポートします。
パブリック クラス Dog_Stub は Dog を実装します
{
ソケットソケット。
ObjectOutputStream oos;
ObjectInputStream です。
public Dog_Stub() が例外をスローする
{
ソケット = 新しいソケット( "wudi", 8000 );
Oos = 新しい ObjectOutputStream(ソケット.getOutputStream() );
Ois = 新しい ObjectInputStream(ソケット.getInputStream() );
}//Dog_Stub()
public String getName() が例外をスローする
{
Oos.writeObject( "getName()" );
Oos.flush();
return (String)ois.readObject();
}//getName()
}/* Dog_Stub */
この分散オブジェクト プログラムを実行するときは、まず DogServer を実行し、次にクライアントで DogClient を実行して結果を確認します。