把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的过程,首先客户端需要与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
class
HelloWorldBean 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

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

  1. EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean

    该jboss集成到eclipse 关掉Jboss控制台新闻Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorld ...

  2. 使用Charles Proxy提升iOS开发效率

    以前做前端开发的时候,使用最多的工具就是 Fiddler ,用来定位问题.模拟特定场景非常方便,极大提升了开发效率.而转做 iOS 开发以后,一大头疼的问题是 Fiddler 没有 Mac 版,幸亏找 ...

  3. EJB开发第二期---开发具有本地接口的无状态Bean

    一.EJB中的bean 1.1 EJB中bean分类 会话bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过jdbc直接操作数据库,但大多数情况下都 ...

  4. ejb2.0用本地引用提高EJB访问效率

    用本地引用提高EJB访问效率 EJB 1.0和1.1规范只定义了一种在EJB组件中引用另一组件的方法,即通过Bean的远程接口.如果两个Bean都在同一个容器之内,则这种网络开销是不必要的.为解决这个 ...

  5. JBoss+Ant实现EJB无状态会话bean实例

    EJB分为session bean.entity bean.message-driven bean,session bean又分为无状态会话bean和有状态会话bean. session bean负责 ...

  6. EJB是什么?EJB的概念分析与理解(copy)

    [说明:转载于http://blog.csdn.net/jojo52013145/article/details/5783677] 1. 我们不禁要问,什么是"服务集群"?什么是& ...

  7. 关于EJB,为什么用EJB?为什么不用EJB?

    http://blog.csdn.net/linxi1209163com/article/details/51029890 一:什么是EJB 官方说法,就是企业级是基于语言的服务器框架技术,通过我们可 ...

  8. EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)

        一.为什么使用EJB ? 企业Bean执行在EJB容器中.企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式能够 ...

  9. 如何利用 Visual Studio 自带工具提高开发效率

    Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 ...

随机推荐

  1. enumerate给列表加序号

    #coding=utf-8#给列表加上序号,enumerate(l1),默认从0开始l1=['money','house','joo']for item in enumerate(l1,1): #pr ...

  2. [HNOI 2017]单旋

    Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的 ...

  3. [SDOI2016]储能表

    Description 有一个 n 行 m 列的表格,行从 0 到 n−1 编号,列从 0 到 m−1 编号.每个格子都储存着能量.最初,第 i 行第 j 列的格子储存着 (i xor j) 点能量. ...

  4. [AH/HNOI2017]抛硬币

    题目描述 小 A 和小 B 是一对好朋友,他们经常一起愉快的玩耍.最近小 B 沉迷于**师手游,天天刷本,根本无心搞学习.但是已经入坑了几个月,却一次都没有抽到 SSR,让他非常怀疑人生.勤勉的小 A ...

  5. 洛谷P3209 [HNOI2010]PLANAR

    首先用一波神奇的操作,平面图边数m<=3*n-6,直接把m降到n, 然后对于冲突的边一条环内,一条环外,可以用并查集或者2Sat做, 当然并查集是无向的,2Sat是有向的,显然用并查集比较好 复 ...

  6. [BZOJ]1177: [Apio2009]Oil

    题目大意:给出一个n*m的矩阵,选出3个不相交的k*k子矩阵,使得子矩阵中元素和最大.(k<=n,m<=1500) 思路:选出的子矩阵有3种情况:横着排三个.竖着排三个.三角状分布(其中有 ...

  7. NOIP 2013

    Prob.1 转圈游戏 找到循环节,然后快速幂.代码: #include<cstdio> #include<cstring> #include<iostream> ...

  8. Codeforces Round #411 (Div. 2)

    来自FallDream的博客,未经允许,请勿转载,谢谢. 由于人傻又菜 所以这次又滚去div2了  一堆结论题真的可怕 看见E题不是很有思路   然后就去大力搞F题  T了最后一个点 真的绝望   但 ...

  9. NTT+多项式求逆+多项式开方(BZOJ3625)

    定义多项式$h(x)$的每一项系数$h_i$,为i在c[1]~c[n]中的出现次数. 定义多项式$f(x)$的每一项系数$f_i$,为权值为i的方案数. 通过简单的分析我们可以发现:$f(x)=\fr ...

  10. 试说明采用双缓冲技术如何进行I/O操作

    输入设备先将第一个缓冲区装满数据,在输入设备向第二个缓冲区装数据时,处理机就可以从第一个缓冲区取出数据进行处理:当一个缓冲区的数据处理完毕,若第二个缓冲区已经装满,则处理机又可以从第二个缓冲区取出数据 ...