本文主要介绍在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实现——调用(贯穿始终的模块)的更多相关文章

  1. JBOSS EAP 6 系列一 新特性

    在项目中,采用的架构是Springmvc+spring+EJB+Jpa等架构,当然服务器是Jboss,本次Jboss我们采用的是JBossEap6.2,Jboss7的新特性与Jboss4.5的大的改变 ...

  2. JBOSS EAP 6 系列六 公共模块的jar配置到jboss的modules详细配置

    公司项目中遇到并要解决的问题 1:原则上除了自己写的代码之外,公共的jar不应该都在打包的时候打包到ear里面,这样的话包太大,也不符合的分层的逻辑,在jboss容器内部,每个ear的包重复jar都会 ...

  3. JBOSS EAP 6 系列三 Oracle、Mysql数据源的配置(驱动)—认识模块的使用

    本文介绍JBOSS EAP 6.2中Oracle数据源的配置方式.结合之前JBOSS EAP 6.2新功能,本文初识JBOSS模块申明式容器这一特性. 模块申明式容器:JBOSS EAP不再有lib的 ...

  4. JBOSS EAP 6 系列五 Managed domains 管理域最主要的功能是“统一部署,统一配置”

    摘要 本文首先介绍Managed Domain的概念,管理域最主要的功能是"统一部署,统一配置".接下来通过一个实例在"统一配置"部分实现一个双机配置起来的域, ...

  5. 需要安全认证的远程EJB调用示例(Jboss EAP 6.2环境)

    一,Remote EJB 服务接口定义: package yjmyzz.ejb.server.helloworld; public interface HelloWorldService { publ ...

  6. Jboss EAP 6 EJB调用常见问题

    1. 调用EJB的三种方法 调用EAP 6 EJB的第一种方法,使用JBoss API,如下: Properties p = new Properties(); p.put("remote. ...

  7. [转]C# 互操作性入门系列(四):在C# 中调用COM组件

    传送门 C#互操作系列文章: C# 互操作性入门系列(一):C#中互操作性介绍 C# 互操作性入门系列(二):使用平台调用调用Win32 函数 C# 互操作性入门系列(三):平台调用中的数据封送处理 ...

  8. jboss eap 6.3 域(Domain)模式配置

    jboss提供了二种运行模式:standalone(独立运行模式).domain(域模式),日常开发中,使用standalone模式足已:但生产部署时,一个app,往往是部署在jboss集群环境中的, ...

  9. jboss EAP 6.2 + Message Drive Bean(MDB) 整合IBM Webshpere MQ 7.5

    上一篇我们知道了消息驱动Bean的基本用法,实际大型分布式企业应用中,往往会采用高性能的商业Queue产品,比如IBM Webshpere MQ(目前最新版本是7.5 ),下面讲解下如何在Jboss ...

随机推荐

  1. Shiro加密

    在开发的时候,很多数据我们都希望是以加密过后的形式存储起来,而不是最原始的数据. 在shiro中也提供了编码,解码,加密,加密算法实现等等一系列的内容. 编码/解码 在org.apache.shiro ...

  2. HNOI2018 滚粗记

    day0 说好了不复习,于是复习了一下配置,没想到一下就记住了,咋不退役去搞英语竞赛捏 皇室一波攒RP,chicken chicken一波攒RP day1 机子坏了,换到了最后面,但这个时候已经 \( ...

  3. 【NOIP 2017】逛公园

    Description 策策同学特别喜欢逛公园.公园可以看成一张N个点M条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,N号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要 ...

  4. HDU 1729

    给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置 她在行走过程中,不能转太多弯了,否则她会晕倒的. (每次在一个方向上一直走到底,并push ...

  5. 【AIM Tech Round 4 (Div. 2) D Prob】

    ·题目:D. Interactive LowerBound ·英文题,述大意:       有一个长度为n(n<=50000)的单链表,里面的元素是递增的.链表存储在一个数组里面,给出长度n.表 ...

  6. 【uva 1411 Ants蚂蚁们】

    题目大意: ·给你一个n,表示输入n个白点和n个黑点(输入每一个点的坐标).现在需要将各个白点和各个黑点一一用线段连接起来,需要满足这些线段不能够相交. ·特色: 我们如何保证线段间不相交. ·分析: ...

  7. Spring学习笔记3——使用注解的方式完成注入对象中的效果

    第一步:修改applicationContext.xml 添加<context:annotation-config/>表示告诉Spring要用注解的方式进行配置 <?xml vers ...

  8. 实现一个ordeeddict

    class MyOrderdict(): def __init__(self, mydict): self._cur = 0 self._mykeys = [] self._myvalues = [] ...

  9. Tomcat 报错的解决方法:The APR based Apache Tomcat Native library which allows optimal

    下载 http://tomcat.heanet.ie/native/1.1.12/binaries/win32/tcnative-1.dll将这个文件复制到C:\WINDOWS\system32\,. ...

  10. 阿里云部署mongdb(CentOS)

    配置包管理系统 (yum). Xshell登录Linux查看操作系统版本信息 lsb release -a 可以在官网选择对应的版本 :官网的安装指导文档http://docs.mongodb.org ...