读书人

EJB 学习阶段总结:JBoss上发布一个To

发布时间: 2012-09-01 09:33:02 作者: rapoo

EJB 学习阶段总结:JBoss下发布一个Toy企业应用

?

?

?解释题目:为什么叫Toy企业应用,因为接下来全文将要描述的应用(home-test-all.ear)没有任何实际应用价值,之所以发布他,只是为了应用EJB相关技术;

解释企业应用:

????? 一个企业应用是指按照JavaEE标准开发出来比较大型的企业级应用;

????? 一般这样的应用以.ear结尾命名,可以运行在任何JavaEE容器中;

????? 一般一个应用中包括很多模块,如业务处理EJB,Web Client war,描述XML文件等。

关键字:EJB, JMS, JPA,?Oracle10g, Ant,? Hibernate,Jboss ear中发布war

开发工具:Eclipse 3.6,jboss-eap-4.3,apache-ant-1.6.5,Oracle 10g

应用设计思路描述:通过两幅图来说明设计思路

在Jboss中发布完成时Jboss Deploy目录结构:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?通过此图可以得到如下信息:

????? 发布应用的J2EE容器是JBoss?????

????? 该应用名叫home-test-all.ear

????? 该应用中包括六个大模块

设计思路图:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?图中有向箭头代表调运关系,中间大矩形框表示EJB容器,说明每个模块的作用和调运关系:

?

Http Web Client前台界面,指一些浏览器,本例子中设计可以通过浏览器访问我们的应用查看相关信息(查看应用运行日志记录,查看数据库操作记录)Entry Web War包括一个处理核心业务的Servlet(ControllerServlet),所有前台请求都被此Servlet受理,此Servlet处理完后将结果转发会前台CommonUtil包括应用运行中所需的工具类,该应用中的TimerUtil就是记录一次数据库操作(一次Transaction 过程)所需的时间,将所需时间发布到我们定义的JMS Queue中,发布过程是异步处理,在线程中完成Persistence Entity EJB定义了所有实体Bean,这些Bean分为两类,一类是User相关实体,而另一类是记录日志相关的实体,这些实体分别在处理日志的LoggerService Session Bean,UserService Session Bean,监听日志Queue的Audit Message Driven Bean运用loggerService EJB无状态Session Bean,核心业务处理都是在这里完成的,Web Client调运它查看相关日志记录,命令行Client调运它向数据库中插入数据,它调运UserService Bean处理对User对象的增删改查,调运TimeUtil工具类记录时间日志,与数据库交互获取日志信息UserService EJB无状态Session Bean,仅仅负责对User对象持久化维护,包括一些增删改查操作,被LoggerService Session Bean调运JMS Queue保存日志信息的Queue,此应用中TimerUtil是他的消息发送者,Audit Message Driven Bean是他消息订阅者Audit Messaging EJB是一个消息驱动Bean,主要功能是监听日志消失Queue,将受到消息内容提取,保存到数据库Oracle 10g该应用中用到数据存储的数据库Command line Clientjava Client,用来向数据库中插入数据

总结设计思路:

????? 设计的目的主要是用来测试在EJB Session Bean中通过JPA小数据库中插入数据和读取数据所需时间,插入数据包括插入单个数据,插入批量数据,读取单个和读取批量数据;

????? 设计过程:业务核心为处理日志的loggerService EJB,通过loggerService EJB完成相关设计,设计消息Queue的目的是让日志中记录时间更加准确;

分模块说明各模块的设计

1 描述XML文件META-INF模块,如下图,该模块中包括两个XML描述文件:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?application.xml应用全局描述文件,通过application.xml我们定义了home-test-all.ear中所有的模块,如下:

?如上定义home-test-all.ear中包括:home-test.war,userServiceBean.jar,loggerServiceBean.jar,CommonUtil.jar,PersistUnit.jar共五个模块;

注意:一个ear应用中可以包含多个war,这多个war是通过上面描述文件中<context-root>home</context-root>来定义的,context-root中定义的路径描述符与相应war应用中WEB-INF目录下jboss-web.xml中context-root定义的描述符对应

jboss-app.xml文档为该应用指定了类加载器,每个EAR应用的类加载器应该有一个唯一的名称。这里我们使用应用程序名作为类加载器的名称(其实我也不知道是神马作用,我的感觉是没有神马实质是作用,只是一个描述性的文件,这里如果定义了此文件,则在Jboss控制台可以看到相关描述),给出这里描述:


?如上图所示:所有实体间对应关系都是单向的,User和Event,User和Friend,Event和Property,Wife和Pet,Pet和Property关系为一对多关系,User和UserCard,Friend和UserCard,Wife和UserCard,User和Wife之间的关系是一对一关系;

另一类实例类为日志记载类,包括一个实体类Audit,如下:

?配置文件中

????? persistence-unit指定Persist Pojo的路径;

????? provider说明我们用的JPA的实现是Hibernate;

????? jta-data-source说明我们关联的data-source为Oracle;

???? “hibernate.hbm2ddl.auto”值得容器启动时创建表,容器关闭时删除表;

???? "hibernate.show_sql"在容器Console口打印SQL语句;

???? "hibernate.format_sql"说明在容器Console显示的SQL语句是格式化的

说明:<jta-data-source>java:/OracleDS</jta-data-source>? 说明在JBoss_Home\server\production\deploy目录下存在名字为oracle-ds.xml数据源描述文件定义的数据源名为OracleDS,该描述文件的模板在JBoss_Home\docs\examples\jca可以找到,将他做相应拷贝既可以运用,这里描述文件内容如下:

?

3 loggerService EJB

该模块中包括一个无状态Session Bean,和相关Service接口,如下:

?

如上使用标记来说明Bean属性,是EJB3规定:

@Stateless指定LoggerServiceBean 为无状态 SessionBean

@Remote指定LoggerServiceBean 是远程接口

@Local指定LoggerServiceBean 的本地接口

@PersistenceContext(unitName="com.home.po") 指定持久化的数据单元名字

@TransactionAttribute(TransactionAttributeType.REQUIRED)说明EJB容器在执行此方法时Transaction是必须的;

4 UserService EJB模块

UserService EJB同上是无状态持久类和其相关接口,如下

?

消息向JMS Queue 发布消息描述在上篇博客http://kylinsoong.iteye.com/blog/848713中可以找到,如何在JBoss中定义一个Queue,接下来将有描述

6?Audit Messaging EJB

此模块是一个Message Driven Bean,相当于一个JMS 消息订阅者,监听与一个Queue,通过上面我们知道TimerUtil是一个消息发送者,不管是消息发送者和消息订阅者都是基于某一Queue,如何定义一个Queue?这里我是通过JBoss_Home\server\production\deploy\jboss-messaging.sar目录下home-service.xml描述文件定义的,文件内容:

?如上Queue是名字为HomeTestAuditLogQueue,Jboss启动后在Jboss JNDI树上可以看到Queue HomeTestAuditLogQueue;

同样Jboss消息描述文件的模板可以在JBoss_Home\docs\examples\jms下可以找到,只需做少量修改,便可以使用,使用时只需将修改完的文件拷贝到JBoss_Home\server\production\deploy\jboss-messaging.sar既可以,JBoss启动时自动创建描述文件中定义的Queue

此处Message Driven Bean的内容:

?

7 Entry Web War模块

如下图描述了Web模块结构:

?
EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?Web模块的名字为home-test.war,前台界面仅有一个index.jsp,WEB-INF文件下是Web模块的描述文件

WEB-INF内容如下:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?jboss-web.xml内容如下:

?此处定义是context-root与JBoss_Home\server\production\deploy\home-test-all.ear\META-INF下application.xml文件中Web模块定义的context-root相对应

web.xml为Web描述文件如下:

?结果分析:

部署成功后在JMX-console控制页面http://localhost:8080/jmx-console/JMX Agent View可以看到我们home-test-all.ear应用的描述:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?此处显示是在JBoss_Home\server\production\deploy\home-test-all.ear\META-INF下的jboss-app.xml中定义的

同样在JMX Agent View的jboss.jca模块可以看到Oracle数据源相关描述


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
此处显示是在JBoss_Home\server\production\deploy\下的oracle-ds.xml中定义的

查看JNDI View树:http://localhost:8080/jmx-console/HtmlAdaptor,在JMX MBean Operation Result list()中可以看到我们应用定义的War,Queue,EJB等

home-test-all.ear描述如下:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?在Global JNDI Namespace可以看到Queue和EJB相关描述:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?加粗红线指出我们定义的Queue

Session Bean树如下:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?结果测试:

通过Command Line向数据库中插入1个User,并取出,插入100个User,然后取出所有User,再插入1000个User,后取出,完成后我们到前台看数据库操作日志:

http://localhost:8080/home/

点击后可以看到如下界面:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?点击View All Audit Button可以看到如下信息:

概括上述脚步Target作用:

path说明Ant Build过程依赖jar的位置clean删除已经存在的旧的Build结果,包括目录和文件 prepare创建存放编译结果的文件夹,依赖于clean,即创建之前删除已经存在的文件夹compile编译应用中所有的java类,将编译结果存放在prepare创建的文件夹中,依赖于prepareejbjar将上述编译的class文件和相关资源文件打包,将打包结果存放在项目的resource目录,依赖于compiledeploy

将相关jar包和描述文件部署到JBoss_Home\server\production\deploy中,主要包括两类操作:

在JBoss_Home\server\production\deploy下创建所需目录;

将ejbjar中创建的jar包和相关描述文件拷贝到JBoss中

undeploy删除已经部署在JBoss中的应用

补充2:如何使用Eclipse远程调试部署在JBoss上的远程代码,可分两步,如下:

1 修改JBoss 启动脚本run.bat,添加如下一行脚本,实际就是设定了一个JAVA_OPTS变量,该变量包括说明Debug方式,运程Debug网络几乎协议为TCP,TCP远程连接端口8787,启动server选择Yes,挂起Server选择No

?


?

2 Eclipse Debug 设定(以调试上述应用中AuditMessageBean为例说明):

在Eclipse导航栏选择run→Debug Configuration→Remote Java Application→New,给远程调试命名,修改相关端口如下:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?设定完成给AuditLoggerMsgBean中onMessage方法设定断点后运行Debug,然后用Command line Client向数据库中发送一条信息,我们会看到Eclipse执行停止到断点处,如下:


EJB 学习阶段总结:JBoss上发布一个Toy企业应用
?--------------------------------------------------------------------------

到此结束,问题还有很多,此博客太长,现在结束

?

1 楼 lyjilu 2010-12-27 做过ejb的列子。没在实际项目中,不是很了解jboss中具体怎么实现ejb的,没时间看,先shoucang啦,以后看,呵呵,谢谢分享。

读书人网 >操作系统

热点推荐