セッションBeanには複数のインタフェースを実装できます。それぞれのインタフェースは、異なるタイプのクライアント向けです。デフォルトでは、インタフェースはEJB 3.0コンテナと同じJVMで動くローカルクライアント向けです。たとえば前述の例では、JSPページとEJB 3.0コンテナは共にJBossのJVMで稼動します。クライアントがローカルインタフェースでBeanのスタブをルックアップすると、コンテナはセッションBeanオブジェクトのJava参照を返します。Java参照を介したメソッド呼び出しは非常に高速で効率的です。
セッションBeanのもう一つのタイプのインタフェースであるリモートインタフェースは、リモートクライアント向けです。クライアントがリモートインタフェースでBeanのスタブをルックアップすると、コンテナはリモートインタフェースを実装したスタブのシリアライズ(serialize)されたオブジェクトを返します。リモートスタブは、遠隔手続き呼び出し(RPC)をサーバに配信する方法を知っています。クラスタ環境でも同様です。リモートインタフェースも単なるJavaインタフェースです。リモートインタフェースはローカルインタフェースと全く同じメソッドでも構いません。しかし、セッションBeanのリモートインタフェースとローカルインタフェースでは異なるメソッドを表現したい場合が多いでしょう。たとえばCalculatorBean
の場合、リモートインタフェースでは、サーバの情報をリモートクライアントに伝える追加のメソッドが必要でしょう。
public interface RemoteCalculator {
public double calculate (int start, int end,
double growthrate, double saving);
public String getServerInfo ();
}
注意:リモートインタフェースでは、スタブオブジェクトのシリアライズとデシリアライズ(de-serialize)が行われ、Beanインスタンスのすべての呼び出しはネットワーク越しに行われます。ローカルインタフェースよりもかなり非効率的です。ローカルクライアントでのリモートインタフェースのルックアップはなるべく避けてください。
セッションBeanの実装では、@Local
アノテーションと@Remote
アノテーションを用いてローカルインタフェースとリモートインタフェースを指定できます。また、@LocalBinding
アノテーションと@RemoteBinding
アノテーションで、これらのインタフェースの代替JNDI名を指定できます。次に示すのは、代替JNDI名をそれぞれ持つローカルインタフェースとリモートインタフェースの例です。
@Stateless
@Local ({Calculator.class})
@LocalBinding (jndiBinding="EJB3Trail/LocalCalculator")
@Remote ({RemoteCalculator.class})
@RemoteBinding (jndiBinding="EJB3Trail/RemoteCalculator")
public class LocalRemoteCalculator implements Calculator, RemoteCalculator {
public double calculate (int start, int end,
double growthrate, double saving) {
double tmp = Math.pow(1. + growthrate / 12., 12. * (end - start) + 1);
return saving * 12. * (tmp - 1) / growthrate;
}
public String getServerInfo () {
return "This is the JBoss EJB 3.0 TrailBlazer";
}
}
@Local
アノテーションと@Remote
アノテーションは、Beanの実装クラスの替わりに、セッションBeanのインタフェースを指定することができます。たとえば次に示すコードの抜粋は、RemoteCalculator
がリモートインタフェースであることを示しています。こうすることで、CalculatorBean
に@Remote
を指定する必要はなくなります。
@Remote
public interface RemoteCalculator {
// ... ...
}