JBOSS EAP 6 系列四 EJB实现——调用(贯穿始终的模块)
本文主要介绍在JBOSS EAP 6.2(或者JBOSS AS7)中模块是如何贯穿EJB实现的始终。延续上一博文《认识模块的使用》的话题继续聊JBOSS做为模块申明式容器的这一特性在EJB实现中的完全贯彻。
Session bean
JBOSS EAP(AS7)中默认的EJB是3.1版本遵循JSR318规范。EJB从3.0开始已经全面引入Annotation的概念,3.0以前的EJB需要在XML文件里面对Bean所做的配置都能通过标签的方式在代码中实现。同时,之前为了工厂模式而做的双接口Home和Remote已经被一个业务接口所取代。由于Entity Bean的概念已经从EJB中拿出放到了JPA规范中,所以这里只介绍Session Bean最基本的Annotation方式的实现,为后文提供知识基础。
Session Bean由两部分组成:一个业务接口和一个具体实现业务的JAVA类。
业务接口是一个普通的Java接口Interface。
可以被声明为@Local或者@Remote,区别就是标明这个EJB的可见度。
@Local标明这是一个只在同一个容器范围内的应用可见的Session bean
@Remote只要能与这台主机通讯的地方都可以调用这个Session bean。
<span style="font-size:18px;">public interface AssessContentBean extends BaseBean<AssessContent> {
public List<AssessContent> queryContentByTemplateId(String templateId);
public boolean deleteAll(Object[] ids);
}</span>
实现类是一个普通的JAVA类
在类名的上方使用@Stateless或者@Stateful来指明这个Session Bean是否有状态。
@Stateless或者@Stateful标签中可以带上name属性来指明这个无状态Bean的JNDI名称,如果不指明的话实现类的名称就是JNDI名称。
需要注意的一点变化是:与EJB3.0不同的是EJB3.1的JNDI有很大变化,原本在EJB3.0的时候@Stateless(name=”StudentAssessResultBeanImpl”),在客户端可以使用initContext.lookup(“StudentAssessResultBeanImpl”)查到这个bean。
但是EJB3.1的JNDI规范是
java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-quali?fied-interface-name>]
其中WAR包名称app-name,JAR包名称module-name,自定义Bean名称bean-name,接口的全地址名称fully-quali?fied-interface-name。
所以如上申明的@Stateless(name=””)在新的EJB3.1 JNDI中仅只是<bean-name>部分,想要调用这个EJB还需要组合出全部的名称来,具体的JNDI名称在后面的博文中做介绍。
直接上一个最简单的无状态Bean的实例:
<span style="font-size:18px;">@Stateless(name="StudentAssessResultBeanImpl")
@Remote(StudentAssessResultBean.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class StudentAssessResultBeanImpl extends BaseBeanImpl<StudentAssessResult> implements StudentAssessResultBean { @EJB(beanName = "StudentAssessResultEao")
private StudentAssessResultEao studentAssessResultEao; @Override
public BaseEao getBaseEao() {
// TODO Auto-generated method stub23
return this.studentAssessResultEao;
} }</span>
这就是一个最最简单的EJB的实现,对于之前的JBOSS AS到此就可以运行了,但是JBOSS EAP 6.2(或者JBOSS AS7)还需要对EJB做配置,具体配制方法在下一个小节中做介绍。
【EJB学习内容小扩展】
下面列举一些常用的标签,学习完它们大部分的应用都够了。
@Stateless
@Remote
@Local
@LocalBean
@EJB
@Resource
@Inject
@Stateful
@Init
@PostConstruct
@PreDestroy
@PrePassivate
@PostActivate
@Remove
至于EJB复杂实现技术就不做介绍了,要深入了解的可以下载EJB 3.1规范JSR318。
以上介绍的都是服务端EJB的代码,Client端在下一篇博文《让人又爱又恨的EJB3.1 JNDI》介绍JNDI的时候会有更深入的介绍。
2. 贯穿始终的模块
回到模块的话题,模块的具体配置方法请参看《Oracle数据源的配置—认识模块的使用》中第2部分介绍。本节使用一个生产中的实例来说明模块在EJB实现的整个过程中是如何贯穿始终的。
回顾一下本系列第一篇文章《新特性》中所介绍的"模块申明式容器"这一特性:
JBOSS EAP不再有lib的概念,一切都是module。无论是系统调用的lib,用户编制的lib,或者应用程序引用到的第三方lib都以模块的方式构建起来,并在使用的地方申明具体使用了哪个模块。
<span style="font-size:18px;">@Stateless(name="StudentAssessResultBeanImpl")
@Remote(StudentAssessResultBean.class)
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class StudentAssessResultBeanImpl extends BaseBeanImpl<StudentAssessResult> implements StudentAssessResultBean { @EJB(beanName = "StudentAssessResultEao")
private StudentAssessResultEao studentAssessResultEao; @Override
public BaseEao getBaseEao() {
// TODO Auto-generated method stub23
return this.studentAssessResultEao;
} }</span>
有了上一节的铺垫,以上的这段删节的代码中基本显现了整个组件的结构,这是产品中的一个记录日志的组件,包括3个部分:
- LogManager是EJB的具体实现,以上这段代码就是从LogManager中截取出来的。
- logManagerCommon是EJB存放接口、放置与日志调用和存储有关的公共方法和变量的地方。LogManger需要依赖这个Project
- commonClass用来放置项目全局范围内的各种资源。LogManger和LogManangerCommon需要依赖这个Project,同时这个Project也要依赖一些第三方包。
接下来我们来介绍这些部分在JBOSS EAP 6.2中的配置方式:
logManagerCommon和commonClass是做为用户创建的lib使用的,都需要被配置为JBOSS的module。
commonClass被打成jar包,放置在jboss-eap-6.1\modules\com\xx\ngoss\xxx\commonClass\main中,并配置module.xml文件如下,
<span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.xx.ngoss.xxx.commonClass">
<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
<module name="org.jboss.remote-naming"/>
<module name="org.jython"/>
</dependencies>
<resources>
<resource-root path="CommonClass.jar"/>
</resources>
</module></span></span>
其中<module>标签中的name属性将这个模块命名为com.xx.ngoss.xxx.commonClass,同时在<dependencies>标签中指明了commonClass这个模块所依赖的其他模块:
- commonClass依赖了JBOSS容器中的javax.api模块,这是一组与命名服务相关的javax包,在系统模块jboss-eap-6.1\modules\system\layers\base\javax\api\main中被配置为javax.api模块。
- commonClass依赖了JBOSS容器中的javax.transaction.api模块,对应的是jboss-transaction-api_1.1_spec-1.0.1.Final-redhat-2.jar位于jboss-eap-6.1\modules\system\layers\base\javax\transaction\api\main目录中的一个jar包,被容器默认的配置为javax.transaction.api模块。
- commonClass依赖了JBOSS容器中的org.jboss.remote-naming模块,对应的是jboss-remote-naming-1.0.6.Final-redhat-2.jar位于\jboss-eap-6.1\modules\system\layers\base\org\jboss\remote-naming\main目录中的一个jar包,被容器默认的配置为org.jboss.remote-naming模块。
- commonClass还依赖了一个第三方包jython.jar,需要引入并配置成为一个新的JBOSS模块。我们把它放置在jboss-eap-6.1\modules\org\jython\main下,对应的module.xml中配置模块名称为org.jython。
<span style="font-size:18px;"><span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="org.jython">
<dependencies>
<module name="javax.api"/>
</dependencies>
<resources>
<resource-root path="jython.jar"/>
</resources>
</module></span></span>
LogManger是实现EJB业务的地方,最终部署的时候会被放置到jboss-eap-6.1\standalone\deployments中部署。与之前的JBOSS AS不同之处在于:JBOSS EAP 6.1(AS7)中一个EJB项目对JBOSS模块的依赖需要指明在MANIFAST.MF文件中。LogManager/src/META-INF/MANIFEST.MF文件如下配置:
Manifest-Version: 1.0
Dependencies: com.xx.ngoss.xxx.commonClass, com.xx.ngoss.xxx.logManagerCommon, org.jboss.log4j.logmanager
Class-Path:
这样就指明了EJB Project对JBOSS EAP 6.1中配置好的模块com.xx.ngoss.xxx.commonClass,com.xx.ngoss.xxx.logManagerCommon和org.jboss.log4j.logmanager的依赖。才完成整个EJB在JBOSS中的配置工作。剥离业务实现,这个日志组件的配置包括以下三步:
- 将第三方包配置为模块
- 将自己构建的包配置为模块,设置好模块所依赖的系统模块或者第三方包的模块
- 在EJB Project的MANIFEST.MF中指明项目对JBOSS模块的依赖
系统自带包,第三方包,自定义包全都变为模块,模块与组建之间需要指明依赖关系,同时EJB项目也需要指明依赖关系到JBOSS EAP中的组件上。JBOSS EAP 6.1中组件的概念可谓是深入骨髓。
总结
本文首先介绍了最简单的EJB 3.1的实现,随后引入一个实例类说明JBOSS模块是如何配置到EJB项目、用户制作的lib、第三方的lib、系统lib之间来清楚的指明依赖关系的。这种设计为JBOSS容器优化带来了可行性。也在JBOSS EAP 6.1的启动与重启速度中得到了充分的证明。
但从开发人员的角度出发,虽然开发环境中JBOSS的起降性能有很大提升,但是这种所有lib都需要配置为module的方式没有原来直接仍到lib中的方式容易实现,由于module可能被配置在$JBOSS_EAP$/modules目录下的任何一级目录下,有的或许系统里面已经有了,有的需要引入,引入到什么位置,都由开发人员自行决定。这样的自由度一方面给开发人员带来了额外的工作量,另一方面如果多个开发人员一起开发,不同的模块引入相同的包到了不同级别的目录下,从而引发冲突。
总结
综上所述,模块申明式容器这一新特性,从性能的角度来看值得欣赏,但对于开发人员来说是利弊参半,我们慢慢的深入体会吧。
JBOSS EAP 6 系列四 EJB实现——调用(贯穿始终的模块)的更多相关文章
- JBOSS EAP 6 系列一 新特性
在项目中,采用的架构是Springmvc+spring+EJB+Jpa等架构,当然服务器是Jboss,本次Jboss我们采用的是JBossEap6.2,Jboss7的新特性与Jboss4.5的大的改变 ...
- JBOSS EAP 6 系列六 公共模块的jar配置到jboss的modules详细配置
公司项目中遇到并要解决的问题 1:原则上除了自己写的代码之外,公共的jar不应该都在打包的时候打包到ear里面,这样的话包太大,也不符合的分层的逻辑,在jboss容器内部,每个ear的包重复jar都会 ...
- JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用
本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...
- JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”
摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...
- 需要安全认证的远程EJB调用示例(Jboss EAP 6.2环境)
一,Remote EJB 服务接口定义: package yjmyzz.ejb.server.helloworld; public interface HelloWorldService { publ ...
- Jboss EAP 6 EJB调用常见问题
1. 调用EJB的三种方法 调用EAP 6 EJB的第一种方法,使用JBoss API,如下: Properties p = new Properties(); p.put("remote. ...
- [转]C# 互操作性入门系列(四):在C# 中调用COM组件
传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...
- jboss eap 6.3 域(Domain)模式配置
jboss提供了二种运行模式:standalone(独立运行模式).domain(域模式),日常开发中,使用standalone模式足已:但生产部署时,一个app,往往是部署在jboss集群环境中的, ...
- jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5
上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss ...
随机推荐
- PyQt5 QSerialPort子线程操作
环境: python3.6 pyqt5 只是简单的一个思路,请忽略脆弱的异常防护: # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets im ...
- python3.6安装PyQt5
1.安装环境: python3.6 win8系统 2.安装方法 直接在windows cmd命令行(不需要进入python命令行模式)内输入 pip install PyQt5 等一会就行了. 用pi ...
- Java IO(二)
上一节我们说到通过File访问文件,但是我们访问文件的最终目的都是访问文件中的内容,那么这个时候我们就需要使用到的一个类就是:RandomAccessFile. 此类的定义如下: public cla ...
- SQL学习之查询
查询实例: 1.创建数据库并使用: create database school; use school; 2.创建表并插入内容: create table student( Sno char(9) ...
- [JLOI 2012]树
Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...
- 计蒜客NOIP模拟赛(3)D2T1 小区划分
一条街道的两侧各连续坐落着 N 座单元楼.现在要为这些单元楼划分居民校区. 规则如下: 每个小区只能由同一侧连续的若干座单元楼组成.且两侧都恰有 K 个小区(每个小区至少有一栋楼). 两侧的小区划分规 ...
- ●BZOJ 4556 [Tjoi2016&Heoi2016]字符串
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...
- NOIP2014-9-6模拟赛
工资 (money/money.in/money.out) 时限1000ms 内存256MB 聪哥在暑假参加了打零工的活动,这个活动分为n个工作日,每个工作日的工资为Vi.有m个结算工钱的时间,聪哥可 ...
- [USACO Dec06]产奶的模式
Description 农夫约翰发现他的奶牛产奶的质量一直在变动.经过细致的调查,他发现:虽然他不能预见明天产奶的质量,但连续的若干天的质量有很多重叠.我们称之为一个“模式”. 约翰的牛奶按质量可以被 ...
- hdu5635 BestCoder Round #74 (div.2)
LCP Array Accepts: 131 Submissions: 1352 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 13 ...