WebLogicはRMIを使う際に特別な配慮をしてくれるので、標準のRMIとは実装方法が多少異なる。
|
|
まず、インターフェースを作る。
このインターフェースを経由してクライアントからメソッドを呼び出すことになる。
package jp.hishidama.rmi; import java.rmi.Remote; public interface RmiSample extends Remote { public String getMessage(); }
WebLogicのRMIでは、java.rmi.Remoteからextendsするだけでよい。
(各メソッドに「throws RemoteException」を付ける必要も無い)
次に、インターフェースを実装したクラスを作る。
このクラスのインスタンスが実際に呼ばれることになる。
package jp.hishidama.rmi;
public class RmiSampleImpl implements RmiSample {
public String getMessage() {
String home = System.getProperty("wls.home");
return "RmiSampleImplメッセージ: " + this + " / " + home;
}
}
WebLogicのRMIでは、Serializableをimplementsする必要は無い。
(実行時に)実装クラスのインスタンスをWebLogicのJNDIへ登録(バインド)する。
以下の例では、RmiSampleNameという名前を付けてバインドしている。
public static void main(String[] args) throws NamingException { InitialContext ctx = initContext(); Object obj = new RmiSampleImpl(); ctx.rebind("RmiSampleName", obj); for (;;); }
ここで登録したインスタンス(にアクセスするプロキシー)が、クライアントから取得される。
バッチの場合、最後に無限ループにしておかないと、JNDIからインスタンスを取得できない。(プログラムが終了すると、JNDIから消される為?)
public class RmiServlet extends HttpServlet { @Override public void init() throws ServletException { try { InitialContext ctx = new InitialContext(); Object obj = new RmiSampleImpl(); ctx.rebind("RmiSampleName", obj); } catch (NamingException e) { throw new ServletException(e); } } 〜 }
サーブレットのinit()は、そのサーブレットが初めてインスタンス化するときに一度だけ呼ばれる。
(そのサーブレットにブラウザーからアクセスしないとインスタンス化されないけどね)
WebLogicのJNDIの機能を利用して、リモートオブジェクト…JNDIに登録されているインスタンス(にアクセスするプロキシー)を取得する。
public static void main(String[] args) throws NamingException { InitialContext ctx = initContext(); RmiSample rs = (RmiSample) ctx.lookup("RmiSampleName"); String msg = rs.getMessage(); System.out.println(msg); }
インターフェース経由で呼び出すことで、WebLogic内で管理されているインスタンスのメソッドが呼ばれる。
(何度呼び出しても、同じインスタンスへのアクセスとなる)