本篇博客讲解一下远程调用和本地调用。首先要先了解一下几组概念。
远程客户端:客户端与其调用的JEB对象不再同一个JVM进程中。为了创建一个能够被远程访问的企业Bean,你必须用@Remote注解来定义这些Bean。
本地客户端:客户端与其调用的EJB对象在同一个JVM进程中。为了创建一个能够被本地访问的企业Bean,你必须用@Local注解来定义这些Bean。
远程调用:JNDI lookup以remote方式进行调用,远程调用客户端与服务器之间通信的时候,数据需序列化之后用传值的方式传输。
本地调用:JNDI lookup以local方式进行调用,本地调用客户端与服务器之间通信的时候,数据不需序列化,用传址的方式传输。
本地客户端可以用remote方式也可以用local方式访问企业Bean。远程客户端只可以用remote方式。
创建一个EJBProject
实体类:
/** * 要在 远程客户端和EJB之间传输对象,这些对象必须是可序列化的!如果是本地客户端就不用序列化 * @author 宋笑 * */ public class User implements Serializable{ private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }实现类 Bean :
@Stateless @Remote(UserManager.class)//远程调用 @Local(UserManager.class) //本地调用 public class UserManagerBean implements UserManager { public void saveUser(User user) { System.out.println("User[name = " + user.getName() + "]已经被保存"); user.setId(10); } }
public class RemoteEjbClient { /** * @param */ public static void main(String[] args) throws Exception { InitialContext ctx = new InitialContext(); //远程客户端只能调用远程接口 UserManager ejb = (UserManager)ctx.lookup("UserManagerBean/remote"); User user = new User(); user.setName("张三"); ejb.saveUser(user); System.out.println("用户 " + user.getName() + "已经保存 ID = " +user.getId() ); } }结果:
创建一个JavaProject项目,并把项目部署到同一个JBOSS下。这样的话就属于本地客户端了。
<%
InitialContext context=newInitialContext();
UserManageruserManager=(UserManager)context.lookup("UserManagerBean/local");
User use=new User();
use.setName("张三");
userManager.saveUser(use);
out.print("张三用户ID为"+use.getId());
%>
结果:
<body>
<%
InitialContext context=newInitialContext();
UserManageruserManager=(UserManager)context.lookup("UserManagerBean/remote");
User use=new User();
use.setName("张三");
userManager.saveUser(use);
out.print("张三用户ID为"+use.getId());
%>
</body>
结果:
这样很好的证明了,如果是远程调用,客户端操纵的Bean的参数,其实是一份参数值的拷贝,因此,对参数的修改,不会影响到Bean。但是对于本地调用来说,客户端操纵的Bean的参数,就是一个引用,它对参数的修改,将会影响到Bean。