首页 > 代码库 > EJB通过ANT提高EJB应用的开发效率、开发具有本地接口的无状态bean、开发有状态bean

EJB通过ANT提高EJB应用的开发效率、开发具有本地接口的无状态bean、开发有状态bean

把jboss集成进eclipse

关闭Jboss控制台按Ctrl+c,在MyEclipse→Servers→Jboss里面可以配置JBoss。

通过ANT提高EJB应用的开发效率

在HelloWorld 加入ANT,右击项目新建xml:build.xml,右击打开方式选择Ant ..

对应用进行编译、打包、发布、解发布

 

<?xml version="1.0" encoding="UTF-8"?>
<!--basedirz项目所在路径,.代表在build.xml的所在路径-->
<project name="HelloWorld" basedir=".">
	<property name="src.dir" value=http://www.mamicode.com/"${basedir}/src">> 

发布:在servers视图启动Jboss,然后在build.xml的大纲视图右击deploy→run as → Ant ..

(发现编码问题我项目是GBK,把项目改成UTF-8即可);

 

卸载EJB,要先停止Jboss在执行undeploy即可;

开发具有本地接口的无状态bean

         之前我们介绍过远程接口,通过一个远程接口调用EJB的过程,首先客户端需要与EJB建立socket通信,在通信管道上它们需要来回发送IIOP协议信息,因为数据要在网络进行传输,存放数据的Java对象必须要进行序列化。在这个过程,有网络通信的开销、协议解析的开销、对象序列化的开销等。因为EJB是分布式技术,它允许客户端与EJB应用在不同机器上,所以这些性能开销也是必然的。

         但是在实际开发中,客户端与EJB应用运行在同一个JBoss中。这时候客户端访问EJB是否有必要走上面的网络通信呢?据我们所知,这时候客户端与EJB是在同一个JVM内,他们之间完全可以通过内存进行交互,这样就可以避免网络通信的性能开销。既然我们都想到了这一点,EJB专家组也想到了这一点,所以引入了本地接口。通过本地接口调用EJB,直接在内存中交互,这样就能避免因网络通信所造成的各种性能开销。但是有一点,大家必须注意,只有客户端与EJB应用在同一个JVM内运行的时候,我们才能调用本地接口,否则只能调用远程接口。

只要客户端与EJB发布在同一个JBoss内,我们就认为他们是在同一个JVM。

        

 

客户端和EJB部署到同机器上面

将HelloWorldBean指定为本地接口(@Remote修改为@Local):

@Stateless

@Local(HelloWorld.class)

public classHelloWorldBean implementsHelloWorld {

 

本地接口的无状态bean已经被开发出来了。

通过Ant的deploy部署到EJB中。

 

新建一个web Project 做为EJB的客户端,并且部署到Jboss中,这样客户端和EJB就在同一个jvm中了。

新建Web Projcet:EJBClient,部署到Jboss,

在用jsp调用EJB,新建test.jsp,将编码格式换成utf-8,这样就可以通过本地接口访问EJB了(把HelloWorld项目引用进来:右击项目Build Path→Conf…→Projects→add):

 

<%@ pagelanguage="java"import="java.util.*"pageEncoding="UTF-8"%>

<%@ pageimport="javax.naming.*,cn.hqu.ejb3.*"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

 

<!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML 4.01 Transitional//EN">

<html>

  <head>

    <basehref="<%=basePath%>">

   

    <title>My JSP‘test.jsp‘ starting page</title>

   

    <metahttp-equiv="pragma"content="no-cache">

    <metahttp-equiv="cache-control"content="no-cache">

    <metahttp-equiv="expires"content="0">   

    <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">

    <metahttp-equiv="description"content="This is my page">

    <!--

    <linkrel="stylesheet" type="text/css"href="styles.css">

    -->

 

  </head>

 

  <body>

      <%

       try {

           InitialContextctx = new InitialContext();

           HelloWorldhelloworld = (HelloWorld) ctx

                  .lookup("HelloWorldBean/local");

           out.println(helloworld.sayHello("本地的苏志达"));

       }catch (NamingException e) {

           e.printStackTrace();

       }

    %>

  </body>

</html>

 

客户端应用开发完了,导出war文件,将war文件拷贝到Jboss的发布目录下,看控制台发现应用发布成功了(可以通过MyEclipse部署项目到Jboss,启动Jboss即可发布)

http://localhost:8080/EJBClient/test.jsp

 

通过本地接口调用EJB成功了,web应用和EJB部署到同一个Jboss中的,在同一个jvm中,可以进行访问。

 

客户端和EJB部署到不同机器上面,

新建一个本地接口,在HelloWorld项目新建HelloWorldLocal接口,继承远程接口HelloWorld。

HelloWorldBean实现HelloWorldLocal和HelloWorld接口。

 

@Stateless

@Remote(HelloWorld.class)

@Local(HelloWorldLocal.class)

public class HelloWorldBean implements HelloWorld,HelloWorldLocal {

    @Override

    public StringsayHello(String name) {

        return name+"说:你好!";

    }

}

 

部署同一个机器上的时候优先调用本地,不同机器上我们只能通过远程接口访问。

本地调用:部署启动JBoss运行http://localhost:8080/EJBClient/test.jsp

远程调用:

将HelloWorld的EJBClient类改为远程接口:

HelloWorldhelloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");

部署发布:运行Ant deploy,启动Jboss运行main方法。

在客户端通过远程接口调用EJB,现在他们是在不同JVM内的,只能通过远程接口访问,运行EJBCLient的mian方法,成功访问到。

 

在实际应用中我们最好把本地接口和远程借口都实现出来,主要是可以解决可以发布在同一个Jboss或者不同Jboss都可以使用。

开发有状态bean

只需要修改@Stateless为@Stateful就可以标注为有状态bean

@Stateful

@Remote(HelloWorld.class)

@Local(HelloWorldLocal.class)

public class HelloWorldBean implementsHelloWorld,HelloWorldLocal {

    @Override

    public StringsayHello(String name) {

        return name+"说:你好!";

    }

}

 

Ant deploy部署

 

有状态和无状态在代码上需然差别不大,但是采用对bean的管理的技术的不一样的.

Bean实例的两种管理技术

1.无状态bean使用实例池技术管理bean

2.有状态bean使用激活(activation)管理bean

         每个用户都有自己的Bean实例,相当于有多少个用户就有多少个Bean实例为之服务。如果不采取任何机制,这样必然会导致服务器资源严重消耗,最后落个down机罢工。为了解决这个问题,EJB引入了激活机制。该机制实现的原理是这样的,在EJB服务器需要节省资源时,就从内存中收回bean实例,将其所保持的会话状态序列化到硬盘中,并且释放其所占有的内存。若此时客户端对EJB再次发起请求,EJB容器会重新实例化一个Bean实例,并从硬盘中将之前的状态恢复。

代码:http://pan.baidu.com/s/1gdGIi8V