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="${basedir}\src"></property>
- <!--指的是系统变量-->
- <property environment="env"></property>
- <property name="jboss.home" value="${env.JBOSS_HOME}"></property>
- <!--用于指定眼下JBoss使用的配置项-->
- <property name="jboss.server.config" value="default"></property>
- <!--用于编译源文件class类存放的文件夹-->
- <property name="build.dir" value="${basedir}\build"></property>
- <!--ejb依赖的jar文件-->
- <path id="build.classpath">
- <fileset dir="${jboss.home}\client">
- <include name="*.jar"/>
- </fileset>
- <pathelement location="${build.dir}"/>
- </path>
- <target name="prepare">
- <delete dir="${build.dir}"></delete>
- <mkdir dir="${build.dir}"></mkdir>
- </target>
- <target name="compile" depends="prepare" description="编译">
- <!--对源文件进行编译。destdir编译后class存放文件夹-->
- <javac srcdir="${src.dir}" destdir="${build.dir}">
- <!--编译依赖的jar文件-->
- <classpath refid="build.classpath"></classpath>
- </javac>
- </target>
- <target name="EJBjar" depends="compile" description="创建EJB公布包">
- <!--${ant.project.name}就是上面的name HelloWorld-->
- <jar jarfile="${basedir}\${ant.project.name}.jar">
- <fileset dir="${build.dir}" >
- <include name="**/*.class"/>
- </fileset>
- </jar>
- </target>
- <target name="deploy" depends="EJBjar" description="公布EJB">
- <copy file="${basedir}\${ant.project.name}.jar"
- todir="${jboss.home}\server\${jboss.server.config}\deploy"></copy>
- </target>
- <target name="undeploy" description="卸载ejb">
- <delete file="${jboss.home}\server\${jboss.server.config}\deploy\${ant.project.name}.jar"></delete>
- </target>
- </project>
公布:在servers视图启动Jboss。然后在build.xml的大纲视图右击deploy→run as → Ant ..
(发现编码问题我项目是GBK,把项目改成UTF-8就可以);
卸载EJB,要先停止Jboss在运行undeploy就可以;
开发具有本地接口的无状态bean
之前我们介绍过远程接口。通过一个远程接口调用EJB的过程。首先client须要与EJB建立socket通信。在通信管道上它们须要来回发送IIOP协议信息,由于数据要在网络进行传输,存放数据的Java对象必须要进行序列化。在这个过程。有网络通信的开销、协议解析的开销、对象序列化的开销等。由于EJB是分布式技术。它同意client与EJB应用在不同机器上。所以这些性能开销也是必定的。
可是在实际开发中,client与EJB应用执行在同一个JBoss中。
这时候client訪问EJB是否有必要走上面的网络通信呢?据我们所知,这时候client与EJB是在同一个JVM内,他们之间全然能够通过内存进行交互,这样就能够避免网络通信的性能开销。既然我们都想到了这一点,EJB专家组也想到了这一点,所以引入了本地接口。通过本地接口调用EJB,直接在内存中交互。这样就能避免因网络通信所造成的各种性能开销。可是有一点。大家必须注意,仅仅有client与EJB应用在同一个JVM内执行的时候,我们才干调用本地接口,否则仅仅能调用远程接口。
仅仅要client与EJB公布在同一个JBoss内。我们就觉得他们是在同一个JVM。
client和EJB部署到同机器上面
将HelloWorldBean指定为本地接口(@Remote改动为@Local):
@Stateless
@Local(HelloWorld.class)
public
classHelloWorldBean implementsHelloWorld {
本地接口的无状态bean已经被开发出来了。
通过Ant的deploy部署到EJB中。
新建一个web Project 做为EJB的client。而且部署到Jboss中,这样client和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>
client应用开发完了。导出war文件,将war文件复制到Jboss的公布文件夹下,看控制台发现应用公布成功了(能够通过MyEclipse部署项目到Jboss,启动Jboss就可以公布)
http://localhost:8080/EJBClient/test.jsp
通过本地接口调用EJB成功了。web应用和EJB部署到同一个Jboss中的。在同一个jvm中。能够进行訪问。
client和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方法。
在client通过远程接口调用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实例为之服务。假设不採取不论什么机制,这样必定会导致server资源严重消耗,最后落个down机罢工。
为了解决问题。EJB引入了激活机系统。该机构的原理来实现,这是,在EJBserver如果有必要,节约资源。从内存中恢复bean示例。将举行它的会话状态序列化到磁盘,他们占用内存释放。如果此时client正确EJB再次发起请求,EJB再次实例化一个容器Bean示例,并从硬盘的状态恢复在先前。
码:http://pan.baidu.com/s/1gdGIi8V
EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean的更多相关文章
- EJB通过ANT提高EJB应用的开发效率、开发具有本地接口的无状态bean、开发有状态bean
把jboss集成进eclipse 关闭Jboss控制台按Ctrl+c,在MyEclipse→Servers→Jboss里面可以配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorl ...
- 收下这款 Vue 项目模版,它将让你的开发效率在 2021 年提高 50%
这是什么 vue-automation 是一款开箱即用的 Vue 项目模版,它基于 Vue CLI 4 众所周知,虽然 Vue CLI 提供了脚手架的功能,但由于官方的脚手架过于简单,运用在实际项目开 ...
- ejb2.0用本地引用提高EJB访问效率
用本地引用提高EJB访问效率 EJB 1.0和1.1规范只定义了一种在EJB组件中引用另一组件的方法,即通过Bean的远程接口.如果两个Bean都在同一个容器之内,则这种网络开销是不必要的.为解决这个 ...
- JBoss+Ant实现EJB无状态会话bean实例
EJB分为session bean.entity bean.message-driven bean,session bean又分为无状态会话bean和有状态会话bean. session bean负责 ...
- EJB是什么?EJB的概念分析与理解(copy)
[说明:转载于http://blog.csdn.net/jojo52013145/article/details/5783677] 1. 我们不禁要问,什么是"服务集群"?什么是& ...
- EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)
一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...
- 关于EJB,为什么用EJB?为什么不用EJB?
http://blog.csdn.net/linxi1209163com/article/details/51029890 一:什么是EJB 官方说法,就是企业级是基于语言的服务器框架技术,通过我们可 ...
- Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能
Chrome 开发者工具的Timeline和Profiles提高Web应用程序的性能 二.减少 HTTP 的请求数 当用户浏览页面时,如果我们在用户第一次访问时将一些信息一次性加载到客户端缓存, ...
- SSH深度历险(三) EJB Session Bean有状态和无状态的差别与联系
刚開始对两种sessionbean存在误解.觉得有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用.而觉得无状态是每次调用实例化一次,不保留用户信息.细致分析并用实践检验后,会发现,事实 ...
随机推荐
- QNX 多线程 (线程1每隔20ms读取 number;线程2每隔10ms计算一次)
#include <pthread.h>#include <stdio.h>#include <sys/time.h>#include <string.h&g ...
- Lucene.Net 2.3.1开发介绍 —— 一、接触Lucene.Net
原文:Lucene.Net 2.3.1开发介绍 -- 一.接触Lucene.Net 1.引用Lucene.Net类库找到Lucene.Net的源代码,在“C#\src\Lucene.Net”目录.打开 ...
- Linux Shell常用技巧(二) grep
七. grep家族: 1. grep退出状态: 0: 表示成功: 1: 表示在所提供的文件无法找到匹配的pattern: 2: 表示参数中提供的文件不存在. 见如 ...
- 图解UML类与类之间的六中关系
大话设计模式上的一个图,我用EA画出来的: UML中的6大关系相关英文及音标: 依赖关系 dependency [di'pendənsi] 关联关系 association [ə,səuʃi' ...
- Qt移动版优化后台云服务、支持跨平台开发
http://mp.weixin.qq.com/mp/appmsg/show?__biz=MjM5MDE0Mjc4MA==&appmsgid=10000461&itemidx=2&am ...
- HDU 3853 期望概率DP
期望概率DP简单题 从[1,1]点走到[r,c]点,每走一步的代价为2 给出每一个点走相邻位置的概率,共3中方向,不动: [x,y]->[x][y]=p[x][y][0] , 右移:[x][y ...
- 黑客白皮书:如何成为一名黑客(附FAQ)
内容一览 为什么会有这份文档? 什么是黑客? 黑客应有的态度 黑客的基本技能 黑客文化中的地位 黑客和书呆子(Nerd)的联系 风格的意义 其它资源 FAQ(常问问题解答) 作为Jargon Fi ...
- vc++远程调试工具
简单来说: 1>在远程机器跑VC自带的远程调试工具msvsmon.exe,并把要调试的程序跑起来 2>用VC调试器附加进程,即可调试 先展开来说: VC8,VC9都自带远程调试工具,可以在 ...
- MFC TCHAR 和CHAR相互转换
没有定义UNICODE,所以它里面的字符串就是简单用" "就行了,创建工程的时候包含了UNICODE定义,就必须对TCHAR和char进行转换. 首先是把TCHAR转为char / ...
- TComponent明明实现了IDispatch接口,但是却不加上声明,难道是因为FVCLComObject实体对象不存在?
TComponent明明实现了IDispatch接口,可是它的声明却是: TComponent = class(TPersistent, IInterface, IInterfaceComponent ...