EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean...
該jboss集成到eclipse
關(guān)掉Jboss控制臺(tái)新聞Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss。
通過ANT提高EJB應(yīng)用的開發(fā)效率
在HelloWorld 增加ANT,右擊項(xiàng)目新建xml:build.xml,右擊打開方式選擇Ant ..
相應(yīng)用進(jìn)行編譯、打包、公布、解公布
?
<?xml version="1.0" encoding="UTF-8"?
> <!--basedirz項(xiàng)目所在路徑,.代表在build.xml的所在路徑--> <project name="HelloWorld" basedir="."> <property name="src.dir" value="${basedir}\src"></property> <!--指的是系統(tǒng)變量--> <property environment="env"></property> <property name="jboss.home" value="${env.JBOSS_HOME}"></property> <!--用于指定眼下JBoss使用的配置項(xiàng)--> <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="編譯"> <!--對源文件進(jìn)行編譯。destdir編譯后class存放文件夾--> <javac srcdir="${src.dir}" destdir="${build.dir}"> <!--編譯依賴的jar文件--> <classpath refid="build.classpath"></classpath> </javac> </target> <target name="EJBjar" depends="compile" description="創(chuàng)建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視圖啟動(dòng)Jboss。然后在build.xml的大綱視圖右擊deploy→run as → Ant ..
(發(fā)現(xiàn)編碼問題我項(xiàng)目是GBK,把項(xiàng)目改成UTF-8就可以);
?
卸載EJB,要先停止Jboss在運(yùn)行undeploy就可以;
開發(fā)具有本地接口的無狀態(tài)bean
???????? 之前我們介紹過遠(yuǎn)程接口。通過一個(gè)遠(yuǎn)程接口調(diào)用EJB的過程。首先client須要與EJB建立socket通信。在通信管道上它們須要來回發(fā)送IIOP協(xié)議信息,由于數(shù)據(jù)要在網(wǎng)絡(luò)進(jìn)行傳輸,存放數(shù)據(jù)的Java對象必須要進(jìn)行序列化。在這個(gè)過程。有網(wǎng)絡(luò)通信的開銷、協(xié)議解析的開銷、對象序列化的開銷等。由于EJB是分布式技術(shù)。它同意client與EJB應(yīng)用在不同機(jī)器上。所以這些性能開銷也是必定的。
???????? 可是在實(shí)際開發(fā)中,client與EJB應(yīng)用執(zhí)行在同一個(gè)JBoss中。
這時(shí)候client訪問EJB是否有必要走上面的網(wǎng)絡(luò)通信呢?據(jù)我們所知,這時(shí)候client與EJB是在同一個(gè)JVM內(nèi),他們之間全然能夠通過內(nèi)存進(jìn)行交互,這樣就能夠避免網(wǎng)絡(luò)通信的性能開銷。既然我們都想到了這一點(diǎn),EJB專家組也想到了這一點(diǎn),所以引入了本地接口。通過本地接口調(diào)用EJB,直接在內(nèi)存中交互。這樣就能避免因網(wǎng)絡(luò)通信所造成的各種性能開銷。可是有一點(diǎn)。大家必須注意,僅僅有client與EJB應(yīng)用在同一個(gè)JVM內(nèi)執(zhí)行的時(shí)候,我們才干調(diào)用本地接口,否則僅僅能調(diào)用遠(yuǎn)程接口。
僅僅要client與EJB公布在同一個(gè)JBoss內(nèi)。我們就覺得他們是在同一個(gè)JVM。
????????
?
client和EJB部署到同機(jī)器上面
將HelloWorldBean指定為本地接口(@Remote改動(dòng)為@Local):
@Stateless
@Local(HelloWorld.class)
public classHelloWorldBean implementsHelloWorld {
?
本地接口的無狀態(tài)bean已經(jīng)被開發(fā)出來了。
通過Ant的deploy部署到EJB中。
?
新建一個(gè)web Project 做為EJB的client。而且部署到Jboss中,這樣client和EJB就在同一個(gè)jvm中了。
新建Web Projcet:EJBClient,部署到Jboss。
在用jsp調(diào)用EJB。新建test.jsp,將編碼格式換成utf-8,這樣就能夠通過本地接口訪問EJB了(把HelloWorld項(xiàng)目引用進(jìn)來:右擊項(xiàng)目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("本地的蘇志達(dá)"));
?????? }catch (NamingException e) {
?????????? e.printStackTrace();
?????? }
??? %>
? </body>
</html>
?
client應(yīng)用開發(fā)完了。導(dǎo)出war文件,將war文件復(fù)制到Jboss的公布文件夾下,看控制臺(tái)發(fā)現(xiàn)應(yīng)用公布成功了(能夠通過MyEclipse部署項(xiàng)目到Jboss,啟動(dòng)Jboss就可以公布)
http://localhost:8080/EJBClient/test.jsp
?
通過本地接口調(diào)用EJB成功了。web應(yīng)用和EJB部署到同一個(gè)Jboss中的。在同一個(gè)jvm中。能夠進(jìn)行訪問。
?
client和EJB部署到不同機(jī)器上面。
新建一個(gè)本地接口,在HelloWorld項(xiàng)目新建HelloWorldLocal接口。繼承遠(yuǎn)程接口HelloWorld。
HelloWorldBean實(shí)現(xiàn)HelloWorldLocal和HelloWorld接口。
?
@Stateless
@Remote(HelloWorld.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBean implements HelloWorld,HelloWorldLocal {
??? @Override
??? public StringsayHello(String name) {
??????? return name+"說:你好!
";
??? }
}
?
部署同一個(gè)機(jī)器上的時(shí)候優(yōu)先調(diào)用本地,不同機(jī)器上我們僅僅能通過遠(yuǎn)程接口訪問。
本地調(diào)用:部署啟動(dòng)JBoss執(zhí)行http://localhost:8080/EJBClient/test.jsp
遠(yuǎn)程調(diào)用:
將HelloWorld的EJBClient類改為遠(yuǎn)程接口:
HelloWorldhelloworld = (HelloWorld) ctx.lookup("HelloWorldBean/remote");
部署公布:執(zhí)行Ant deploy,啟動(dòng)Jboss執(zhí)行main方法。
在client通過遠(yuǎn)程接口調(diào)用EJB,如今他們是在不同JVM內(nèi)的,僅僅能通過遠(yuǎn)程接口訪問,執(zhí)行EJBCLient的mian方法。成功訪問到。
?
在實(shí)際應(yīng)用中我們最好把本地接口和遠(yuǎn)程借口都實(shí)現(xiàn)出來。主要是能夠解決能夠公布在同一個(gè)Jboss或者不同Jboss都能夠使用。
開發(fā)有狀態(tài)bean
僅僅須要改動(dòng)@Stateless為@Stateful就能夠標(biāo)注為有狀態(tài)bean
@Stateful
@Remote(HelloWorld.class)
@Local(HelloWorldLocal.class)
public class HelloWorldBean implementsHelloWorld,HelloWorldLocal {
??? @Override
??? public StringsayHello(String name) {
??????? return name+"說:你好。";
??? }
}
?
Ant deploy部署
?
有狀態(tài)和無狀態(tài)在代碼上需然區(qū)別不大。可是採用對bean的管理的技術(shù)的不一樣的.
Bean實(shí)例的兩種管理技術(shù)
1.無狀態(tài)bean使用實(shí)例池技術(shù)管理bean
2.有狀態(tài)bean使用激活(activation)管理bean
???????? 每一個(gè)用戶都有自己的Bean實(shí)例,相當(dāng)于有多少個(gè)用戶就有多少個(gè)Bean實(shí)例為之服務(wù)。假設(shè)不採取不論什么機(jī)制,這樣必定會(huì)導(dǎo)致server資源嚴(yán)重消耗,最后落個(gè)down機(jī)罷工。
為了解決問題。EJB引入了激活機(jī)系統(tǒng)。該機(jī)構(gòu)的原理來實(shí)現(xiàn),這是,在EJBserver如果有必要,節(jié)約資源。從內(nèi)存中恢復(fù)bean示例。將舉行它的會(huì)話狀態(tài)序列化到磁盤,他們占用內(nèi)存釋放。如果此時(shí)client正確EJB再次發(fā)起請求,EJB再次實(shí)例化一個(gè)容器Bean示例,并從硬盤的狀態(tài)恢復(fù)在先前。
碼:http://pan.baidu.com/s/1gdGIi8V
轉(zhuǎn)載于:https://www.cnblogs.com/yxwkf/p/5042703.html
總結(jié)
以上是生活随笔為你收集整理的EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络邻居无法共享解决办法
- 下一篇: 使用Exchange 的SMTP连接器路