做个笔记以免忘记了。
EJB远程调用使用scoket通信,遵循IIOP协议,对象要经过序列化才能传输。有网络的开销,协议的开销,对象序列化的开销。
EJB和客户端分别部署在不同的JVM中时使用远程调用。
这里我是用的是JBoss4-2-3 GA版本作讲解。
第一步:编写接口
public interface HelloWorld {
public String sayHello(String name);
}
第二部:编写实现类
import javax.ejb.Remote;
import javax.ejb.Stateless;
@Stateless
@Remote(HelloWorld.class)
public class HelloWorldImpl implements HelloWorld {
public String sayHello(String name) {
return name+" 你好,世界";
}
}
注意:编写好实现类后,我们要声明类为有状态或者无状态的bean,用注解Stateless,还要标明是该bean是远程调用类型。
到这一步简单的EJB已经开发完成了,下面我们要将其部署到JBoss中,使用eclipse导出为jar包后放到jboss解压目录D:\jboss-4.2.3.GA\server\default\deploy,在目录D:\jboss-4.2.3.GA\bin中双击运行run.bat,启动jboss即可完成部署。
第三步:编写调用EJB的客户端代码
(1) 新建jndi.properties文件
在文件中输入:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
(2)客户端调用的java类
import javax.naming.InitialContext;
import cn.itcast.ejb3.HelloWorld;
public class EJBClient {
public static void main(String args[]){
try {
InitialContext ctx=new InitialContext();
HelloWorld hw=(HelloWorld)ctx.lookup("HelloWorldImpl/remote");
System.out.println(hw.sayHello("yangfeng"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
InitialContext加载jndi上下文信息,构造函数不传参默认读取jndi.properties的配置信息。
至此,成功完成EJB的远程调用。
本地调用:
EJB端基本不用做什么改变,只用讲Remote(HelloWorld.calss)改为Local(HelloWorld.class)即可。
由于本地调用必须部署在同一个JVM中,所以客户端用JavaEE来实现,新建Web Project ,命名为EJBLocalClient
新建test.jsp
内容如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="utf-8"%>
<%@page import="javax.naming.*,cn.itcast.ejb3.HelloWorld" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%try {
InitialContext ctx=new InitialContext();
HelloWorld hw=(HelloWorld)ctx.lookup("HelloWorldImpl/local");
System.out.println(hw.sayHello("本地调用"));
} catch (Exception e) {
e.printStackTrace();
} %>
</body>
</html>
配置EJBLocalClient引入Project EJBLocal,不然test.jsp中HelloWorld类找不到。如下图:
在浏览器输入http://localhost:8080/EJBLocalClient/test.jsp,在eclipse控制台查看输出信息。