当前位置: 技术问答>java相关
怎样调用EJB的问题
来源: 互联网 发布时间:2015-02-23
本文导语: EJB和clien是在同一台机上当然是没有问题啦,但要是不是同一个机子上呢? 比如说,人家在北京部署了一个EJB,就叫EJB1吧,我在广州应该怎么调用它呢?假设我知道它的Home接口和远程接口的方法。 这边写程序调用...
EJB和clien是在同一台机上当然是没有问题啦,但要是不是同一个机子上呢?
比如说,人家在北京部署了一个EJB,就叫EJB1吧,我在广州应该怎么调用它呢?假设我知道它的Home接口和远程接口的方法。
这边写程序调用的时候是不是要有它的class呢?
要是得人家把class给我我才能用的话……我干嘛还这么远来调用它的BEAN?我拿它的class本地部署一个来用不就得了?还要分布式做什么?
要是不需要他们那边的class的话,又应该怎么调用呢?
比如说,人家在北京部署了一个EJB,就叫EJB1吧,我在广州应该怎么调用它呢?假设我知道它的Home接口和远程接口的方法。
这边写程序调用的时候是不是要有它的class呢?
要是得人家把class给我我才能用的话……我干嘛还这么远来调用它的BEAN?我拿它的class本地部署一个来用不就得了?还要分布式做什么?
要是不需要他们那边的class的话,又应该怎么调用呢?
|
不需要有代码,但调用者需要有rmi存根(定义了接口,部署时获得),然后通过配置ejb引用来访问。
欢迎光临Java,J2EE论坛( http://letsjava.yeah.net )。
http://www.minij2ee.com/
欢迎光临Java,J2EE论坛( http://letsjava.yeah.net )。
http://www.minij2ee.com/
|
EJB1Home类是肯定要有的,没有的话,就无法create一个EJB的实例,同样EJB的Remote Inteface类也要有,不然就不知道可以用哪些方法了。具体的代码sun的j2eetoure包中有,weblogic中也有例子。
这里提供一个简单的例子,是我刚写好的,已经测试通过:
/*
* HelloWorldHome.java
*
* Created on 2001年11月13日, 下午9:46
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public interface HelloWorldHome extends javax.ejb.EJBHome {
HelloWorld create() throws java.rmi.RemoteException, javax.ejb.CreateException;
}
/*
* HelloWorld.java
*
* Created on 2001年11月13日, 下午5:27
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public interface HelloWorld extends javax.ejb.EJBObject {
public String sayHello() throws java.rmi.RemoteException;
}
/*
* HelloWorldEJB.java
*
* Created on 2001年11月13日, 下午9:50
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public class HelloWorldEJB implements javax.ejb.SessionBean {
/** Creates new HelloWorldEJB */
public HelloWorldEJB() {
}
public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void setSessionContext(javax.ejb.SessionContext sessionContext) throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbCreate() throws java.rmi.RemoteException, javax.ejb.CreateException{
}
public String sayHello(){
return "Hello World!";
}
}
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.util.Hashtable;
import testejb.HelloWorld;
import testejb.HelloWorldHome;
public class HelloWorldClient {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
//Context ctx = new InitialContext(env);
try {
Context initial = new InitialContext(env);
//Context myEnv = (Context)initial.lookup("java:comp/env");
Object objref = initial.lookup("testejb/HelloWorldHome");
HelloWorldHome home =
(HelloWorldHome)PortableRemoteObject.narrow(objref,
HelloWorldHome.class);
HelloWorld currencyHelloWorld = home.create();
System.out.println(currencyHelloWorld.sayHello());
System.exit(0);
} catch (Exception ex) {
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
}
}
}
这里提供一个简单的例子,是我刚写好的,已经测试通过:
/*
* HelloWorldHome.java
*
* Created on 2001年11月13日, 下午9:46
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public interface HelloWorldHome extends javax.ejb.EJBHome {
HelloWorld create() throws java.rmi.RemoteException, javax.ejb.CreateException;
}
/*
* HelloWorld.java
*
* Created on 2001年11月13日, 下午5:27
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public interface HelloWorld extends javax.ejb.EJBObject {
public String sayHello() throws java.rmi.RemoteException;
}
/*
* HelloWorldEJB.java
*
* Created on 2001年11月13日, 下午9:50
*/
package testejb;
/**
*
* @author hcxing
* @version
*/
public class HelloWorldEJB implements javax.ejb.SessionBean {
/** Creates new HelloWorldEJB */
public HelloWorldEJB() {
}
public void ejbActivate() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbRemove() throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void setSessionContext(javax.ejb.SessionContext sessionContext) throws javax.ejb.EJBException, java.rmi.RemoteException {
}
public void ejbCreate() throws java.rmi.RemoteException, javax.ejb.CreateException{
}
public String sayHello(){
return "Hello World!";
}
}
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import java.util.Hashtable;
import testejb.HelloWorld;
import testejb.HelloWorldHome;
public class HelloWorldClient {
public static void main(String[] args) {
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
//Context ctx = new InitialContext(env);
try {
Context initial = new InitialContext(env);
//Context myEnv = (Context)initial.lookup("java:comp/env");
Object objref = initial.lookup("testejb/HelloWorldHome");
HelloWorldHome home =
(HelloWorldHome)PortableRemoteObject.narrow(objref,
HelloWorldHome.class);
HelloWorld currencyHelloWorld = home.create();
System.out.println(currencyHelloWorld.sayHello());
System.exit(0);
} catch (Exception ex) {
System.err.println("Caught an unexpected exception!");
ex.printStackTrace();
}
}
}
|
明确的说,要!
上面的兄弟不是说了,要接口和RMI存根吗?
你的Home和Remote 接口的class文件是要的,只是不需要Bean的class文件,这里定义了你的EJB的实现业务代码。
|
你通过JNDI查找对象,就是你上文的那个OBJ,至于JNDI怎么找到你所需的对象,看看JDNI文档吧,实际上你得到那个context时,就已经定义了JNDI服务了。
|
访问ejb的client不需要有ejb的业务逻辑代码,但必须要有ejb的接口和rmi存根,否则无法调用。类似corba和dcom。
欢迎光临Java,J2EE论坛( http://letsjava.yeah.net )。
http://www.minij2ee.com/
欢迎光临Java,J2EE论坛( http://letsjava.yeah.net )。
http://www.minij2ee.com/
|
当然,本地机必须要有你调用的home接口类,及object类,而bean类则不需要。
|
jb5会自动生成这个,好象在tools菜单里面
|
这个问题很复杂得,RMI就起到这个作用,你不需要了解到底是怎么调用的(如果你不关心的话)。当然你腰知道在那个EJB1里面有些什么东西。
在你的客户端肯定要用到Lookup()类似的方法(通过EJB1所在的应用服务器),他会找到你要用的EJB1的,当让EJB1部署的地方最好是在“北京”了
在你的客户端肯定要用到Lookup()类似的方法(通过EJB1所在的应用服务器),他会找到你要用的EJB1的,当让EJB1部署的地方最好是在“北京”了