培训资料演示文稿PPT EJB3.0企业开发专题培训资料_第1页
培训资料演示文稿PPT EJB3.0企业开发专题培训资料_第2页
培训资料演示文稿PPT EJB3.0企业开发专题培训资料_第3页
培训资料演示文稿PPT EJB3.0企业开发专题培训资料_第4页
培训资料演示文稿PPT EJB3.0企业开发专题培训资料_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、北京传智播客教育 ejb3.0ejb3.0企业开发企业开发 讲师:讲师: 黎活明黎活明 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 什么是ejbejb enterprice javabeans是一个用于分布式业 务应用的标准服务端组件模型。采用 enterprice javabeans架构编写的应用是 可伸缩的、事务性的、多用户安全的。采用 ejb编写的这些应用,可以部署在任何支持 enterprice javabeans规范的服务器平台, 如jboss、weblogic等。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播

2、客教育 北京传智播客教育 ejbejb用来干什么用来干什么? ? ejb实际上是用于编写业务层代码。如果大家 对于mvc (model-view-controller)结构 的应用有所了解的话,我们知道一个基于mvc 结构的应用应包含显示层、控制层和业务层, 假设我们采用ejb开发基于mvc结构的应用, 那么ejb就是用于开发应用的业务层. 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejbejb的好处的好处 ejb为我们提供了很多在企业开发中需要使用 到的服务,如事务管理/安全/持久化/分布式等, 因为这些服务由容器提供,无需我们自行开发,

3、这样大大减少了我们的开发工作量.另外ejb 提供了强制式分层解耦设计方法 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb3ejb3 vs spring2.5vs spring2.5 估计有同学会问,除了ejb,像spring+hibernate同样提供了事务 管理/持久化服务,好像没有必要使用ejb. 如果你的应用不需要分布式能力,确实没有必要使用ejb, 因为 spring+hibernate提供了大部分原来只有ejb才有的服务,而 且spring提供的有些服务比ejb做的更细致,更周到。那么是不 是有了spring,ejb3就没有必要存

4、在了?这种说法是不正确的, 因为ejb设计的初衷是用于分布式场合,而spring一开始就没有 打算提供分布式功能。所以两者看似有竞争的关系,但实际上两 者的偏重点不一样,像ejb比较适合用于大型企业,因为大型企 业一般都会存在多个信息系统,而这些信息系统又相互关联。为 了避免业务功能重复开发,实现最大程度的重用,有必要把业务 层独立出来,让多个信息系统共享一个业务中心,这样应用就需 要具备分布式能力。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb3ejb3 的分布式特点的分布式特点 高级软件人才实作培训专家高级软件人才实作培训专家 ! !

5、 北京传智播客教育 北京传智播客教育 ejb3ejb3 的分布式特点的分布式特点 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 我是否应该学习我是否应该学习ejb3ejb3 ? ? 经常有同学会问我要不要学习ejb3?如果你学习ejb3只为了找份工 作的话,那么我告诉你一个现实情况, 目前使用ejb3的人数虽然 有所上升,但是在关于ejb3的工作岗位并不多。所以依靠它找工 作的话,恐怕会让你失望。当然如果你只是为了学习的话,那么 ejb3是非常值我们学习的,因为ejb3包含的知识点非常多,学 习它可以开拓我们的知识面。对于一线的java开发人员,

6、我更 是建议,不管在工作中是否用到ejb3,都应该学习一下ejb3, 因为通过学习她,可以让你站在更高的台阶思考问题。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejbejb的发展前景的发展前景 很多人都会问到ejb的发展前景,可以告诉大家ejb的发展前景会越来越好。 目前在java社区关于ejb讨论的话题并不是很多,而且ejb占领的市场 份额也很少,这种情况主要与它的定位有关,至少现在它的定位还是在 分布式应用。有组织统计过在100个项目中,需要分布式的应用只占 15%,而85%的应用都是不需要分布式的,这个比例就决定了关注ejb 的人不会

7、很多,而且ejb所占的市场份额也不会很大。如果ejb要占领大 部分市场份额就必须提供像spring这样的轻量级解决方案。好在ejb专 家组已经认识到了这一点,目前正计划在ejb3.1规范中加入轻量级解决 方案(ejb3.1可能会分成两个版本,一个仍然定位于分布式应用,另一 个定位于轻量级应用)。如果这个计划得以实现的话,恐怕到时ejb3.1 将会逐步吞食由spring占领的市场份额。因为ejb3的开发和spring一 样的简单,而且ejb3是javaee5规范里的技术,所以大部分项目经理 都愿意选择一种开发简单、又被更多厂商兼容的标准技术。 高级软件人才实作培训专家高级软件人才实作培训专家 !

8、 ! 北京传智播客教育 北京传智播客教育 ejb3.0 ejb3.0的学习资源的学习资源 lejb3.0入门经典出版书,网上卖价:45元 购买地址: http:/www.china- lejb3.0实例教程免费电子版 下载地址: http:/ 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb3 ejb3的运行环境的运行环境 ejb3.0应用需要运行在jdk1.5以上版本。 进入http:/ jdk 5.0 update 16(版本在不断更新中,有可能大于16),点击右边的download。 按照安装向导提示安装,安装路径选择c:javajdk

9、1.5.0_16。jdk安装完后,接着问你是否 安装jre,也一起安装上。 右键点击“我的电脑”-“属性”-“高级”-“环境变量”,在“系统变量”里添加 java_home 变量,值为jdk的安装路径,如:c: javajdk1.5.0_16。 在“系统变量”里再添加classpath变量,值为: .;%java_home%libdt.jar;%java_home%libtools.jar; 在系统变量栏找到变量名为path的选项,点“编辑”在变量值的末尾添加 ;%java_home%bin; 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb

10、3 ejb3的运行环境的运行环境 ejb3.0应用需要运行在ejb容器里,下面是一些javaee应用服务器, javaee应用服务器包含web容器和ejb容器。 ljbossjboss(4.2.x4.2.x以上版本)以上版本) 是一个成熟的开源的准javaee应用服务器,在开源javaee应用服务器中所占市场份额第一。如果你打算选 用开源的javaee应用服务器,那么jboss是最值得选择的。 lglassfishglassfish 是一个开源的javaee应用服务器,对javaee规范的支持非常好,其运行性能比较高。因为发展时间相对较 短,市场占有率比较低。另外,它能否提供稳定的运行性能,还

11、有待时间的考验。但本人对其后期的发展非常看 好。绝对跟jboss有的一拼。 lweblogicweblogic(1010以上版本)以上版本) 是商业市场占有率第一的商业javaee应用服务器,它具有出色的稳定性,并提供了人性化的管理界面,还有 企业需要使用到的众多功能。但在ejb3.0领域,本人认为它做的比jboss差些,bug比较多。 lsun application serversun application server(9.09.0以上版本)以上版本) 商业javaee应用服务器,如果你打算选用商业应用服务器运行ejb3,这个是不错的选择。 loracle application se

12、rveroracle application server(10g10g以上版本)以上版本) 商业javaee应用服务器,如果你的数据库是oracle,要想兼容性更好,这个是不错的选择。 lapusicapusic应用服务器应用服务器 这是国内的商业javaee应用服务器,主要在政府中占有一定的市场份额。要批评的是,其向开发人员提供的 文档实在太少了,本人曾经想在其上面开发应用,结果找了大半天也没有找到需要的开发文档。 注意:tomcat目前只是web容器,它不能运行ejb应用。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 下载与安装jboss

13、 l进入http:/ 选择jboss4.2.3.ga下载(大小为95mb),如果你安装的jdk 是1.5版本,请选择jboss-4.2.3.ga.zip 文件下载。 如果你安 装的jdk是1.6版本,请选择jboss-4.2.3.ga-jdk6.zip 文件下 载。下载后直接解压缩文件即可完成安装,为了避免应用出现莫 名的错误,解压缩的路径最好不要带有空格和中文,如 “program files”。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 启动jboss 进入jboss的bin目录,找到启动脚本run.bat 。双击run.bat即可启动j

14、boss,此时 启动的配置项为default。 如果启动出错,请检查下列情况: 1.端口是否被占用,如:8080、1099 2是否为jdk设置的java_home和classpath系统变量,如果没有,请按照前面视频介绍的方 法设置。 3.检查jboss所用的jdk是否1.5以上版本,这些信息可以在jboss的控制台观察到。 4.如果启动时出现这样的错误:“findstr不是内部或外部命令,也不是可运行的程序或批处理文 件”。那么应该在系统变量path中追加“%systemroot%system32;%systemroot%;%systemroot%system32;%systemroot%;

15、”。 最后的办法是重装机器上的jdk,祝你好运。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 为jboss设置jboss_home系统变量 l因为在后面的学习中,我们需要使用到系统变量jboss_home,它指向jboss的安装路径。 所以安装完后我们需要添加该变量,方法是:右键点击“我的电脑”-“属性”-“高级”- “环境变量”,在“系统变量”里添加jboss_home变量,值为jboss的安装路径,如: d:javaeeserverjboss。 l为了方便输入jboss的命令,我们把jboss的bin目录添加到系统路径里。在系统变量一栏找

16、到变量名为path的选项,点“编辑”在变量值的末尾添加:;%jboss_home%bin; 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb中的三种bean 1.1.会话会话bean(session bean)bean(session bean) 负责与客户端交互,是编写业务逻辑的地方,在会话bean中可以通过 jdbc直接操作数据库,但大多数情况下都是通过实体bean来完成对数 据库的操作. 2.2.实体实体bean(entity bean)bean(entity bean) 它实际上属于java持久化规范(简称jpa)里的技术, jpa的

17、出现主 要是为了简化现有的持久化开发工作和整合orm技术,结束现在 hibernate、toplink等orm框架各自为营的局面。 3.3.消息驱动消息驱动bean(message-driven bean)bean(message-driven bean) 它是专门用于异步处理java消息的组件.具有处理大量并发消 息的能力. 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 会话bean 无状态会话bean 平常,我们使用最多的是无状态bean,因为它的bean实例可供 多个用户使用,所以它的性能比有状态bean高.正因为一个 bean实例被多个用

18、户使用.那么,前一个用户设置的值有可能被 后一个用户所修改,所以它无法正确保存某个用户设置的值,因此 是无状态的. 有状态会话bean 有状态bean平常使用的并不多,因为它的一个bean实例只供一 个用户使用,所以性能开销比较大,正因为它的实例只被一个用户 使用, 用户为它设置的值是不会被其他用户修改,所以可以正确 保存用户设置的值,因此是有状态的. 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 如何开发一个无状态会话bean 开发工具: eclipse ide for java ee 下载地址:/do

19、wnloads 开发ejb依赖的jar文件 可以在jboss安装路径的client目录下找到,通常会把client目录下的所有jar 文件添加到项目的类路径下. 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 如何开发一个无状态会话bean 接口(接口可以是远程接口或本地接口) 实现类 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 session beansession bean的客户端开发的客户端开发 public static void main(string args) public stati

20、c void main(string args) properties props = new properties();new properties(); props.setproperty(java.naming.factory.initial, erfaces.namingcontextfactory); props.setproperty(vider.url, localhost:1099); try try initialcontext ctx = new initialcontext(props);new initialconte

21、xt(props); helloworld helloworld = (helloworld) ctx.lookup(helloworldbean/remote); system.out.println(helloworld.sayhello(佛山); catch (namingexception e) catch (namingexception e) system.out.println(e.getmessage(); 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 设置设置jndijndi访问环境信息访问环境信息 在进行jndi查找前,我们必

22、须设置应用服务器的上下文信息,主要是设置jndi驱动的类名( java.naming.factory.initial)和命名服务提供者的url (vider.url) 。 ljava.naming.factory.initial或context.initial_context_factory:环境属性名 ,用于指定initialcontext工厂(作者称它为jndi驱动更容易理解),它类似于jdbc指定 数据库驱动类。 因为本例子连接的是jbossns(命名服务的实现者),所以使用jboss提供的驱动类: erfaces.namingcont

23、extfactory vider.url或context.provider_url:环境属性名,包含提供命名服 务的主机地址和端口号。它类似于jdbc指定数据库的连接url。连接到jbossns的url格 式为:jnp:/host:port,该url的“jnp:”部分是指使用的协议,jboss使用的是基于 socket/rmi的协议。host为主机的地址,port为jndi服务的端口。除了host之外,其他部 分都是可以不写的。 下面是数据库访问例子: class.forname(org.gjt.mm.mysql.driver).newinstance(); p

24、roperties props = new properties(); props.put(user,root); props.put(password,123456); connection conn = drivermanager.getconnection(jdbc:mysql:/localhost:3306/itcast, props); 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 设置设置jndijndi访问环境信息访问环境信息 如同数据库一样,根据访问命名服务器的不同,为上下文设置的驱动类和url也是不同的,如下面是访问sun 应用

25、服务器的上下文信息: properties props = newnew properties(); props.setproperty(java.naming.factory.initial, com.sun.enterprise.naming.serialinitcontextfactory); props.setproperty(vider.url, localhost:3700); initialcontext = newnew initialcontext(props); helloworld helloworld = (helloworld) ctx.

26、lookup(com.foshanshop.ejb3.helloworld); 如果客户端运行在应用服务器内,我们不需要为initialcontext设置应用服务器的上下文信息,也不建议设置 。因为应用服务器启动时会把jndi驱动类等上下文信息添加进系统属性,创建initialcontext对象时如果没 有指定properties参数,initialcontext内部会调用system.getproperty()方法从系统属性里获取必要的 上下文信息。对本例子而言,你可以省略传入props参数,之所以给initialcontext设置参数,目的是引出相 关知识点,便于教学。在实际应用中,如果给

27、initialcontext设置了参数,反而会带来不可移植的问题。 注:创建initialcontext对象时如果没有指定properties参数,initialcontext还会在classpath下寻找 perties文件,并从该文件中加载应用服务器的上下文信息。这样避免了硬编码为initialcontext设 置properties参数。 perties的配置如下: java.naming.factory.initial=erfaces.namingcontextfactory vider.url=loc

28、alhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:erfaces 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 jboss默认生成的jndi 名称 当ejb发布到jboss 时,如果我们没有为它指定全局jndi名称或修改过其默认ejb名称, jboss就会按照默认的命名规则为ejb生成全局jndi名称,默认的命名规则如下: 如果把ejb作为模块打包进后缀为*.ear的java ee企业应用文件,默认的全局jndi名称是 l本地接口:ear-file-base-

29、name/ejb-class-name/local l远程接口:ear-file-base-name/ejb-class-name/remote ear-file-base-name为ear文件的名称,ejb-class-name为ejb的非限定类名 。 例:把helloworld应用作为ejb模块打包进名为helloworld.ear的企业应用文件,它的远程 接口的jndi 名称是:helloworld/helloworldbean/remote 如果把ejb应用打包成后缀为*.jar的模块文件,默认的全局jndi名称是 l本地接口:ejb-class-name/local l远程接口:ej

30、b-class-name/remote 例:把helloworld应用打包成helloworld.jar文件,它的远程接口的jndi名称是: helloworldbean/remote 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 使用注释改变session bean的jndi 名称 如果我们没有指定ejb的jndi名称,当ejb发布到应用服务器时,应用服务器会按默认规则为 ejb生成全局jndi名称。当我们需要自定义jndi名称时,可以这样做 如果ejb在jboss中使用,可以使用jboss提供的 localbinding 和 remotebi

31、nding 注释,localbinding注释指定session bean的local接口的jndi名称, remotebinding注释指定session bean的remote接口的jndi名称,如下: stateless remote (operation.class) remotebinding (jndibinding=foshanshop/remoteoperation) local (localoperation.class) localbinding (jndibinding=foshanshop/localoperation) public class operationbe

32、an implements operation, localoperation 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 使用xml部署描述文件改变session bean的jndi 名称 由于jndi名称与厂商有关,如果使用注释定义jndi名称会带来移植问题,因此建议使用ejb-jar.xml部署描 述文件进行定义,该文件必须放置在jar的meta-inf目录下 helloworldbean helloworldbean ejb-name为ejb名称,mapped-name为bean的jndi名称。目前jboss不支持在ejb-jar.xm

33、l通过 mapped-name指定jndi名称,但我们可以使用他专属的部署描述文件jboss.xml进行定义,如下: helloworldbean hello/remote 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 开发具有开发具有locallocal接口的接口的session beansession bean 之前,我们介绍过远程接口,在这里,我们需要了解一下通过远程接口调用ejb的过程,首先客 户端需要与ejb建立起socket通信,在通信管道上他们之间需要来回发送iiop协议消息, 因为数据要在网络进行传输,存放数据的java对象必须要

34、进行序列化。 socket通信 iiop消息 在这个过程中我们看到,有网络通信的开销、协议解析的开销、对象序列化的开销。因为ejb是 分布式技术,它允许客户端与ejb应用在不同一机器上面,所以这些性能开销也是必然的。 但是在实际生产中,不可避免存在这种情况:客户端与ejb应用运行在同一个jboss中。这 时候客户端访问ejb是否有必要走上面的网络通信呢?据我们所知,这时候客户端与ejb是 在同一个jvm内,他们之间完全可以通过内存进行交互,这样就可以避免网络通信的性能开 销。既然我们都想到了这一点,ejb专家组也想到了这一点,所以引入了本地接口。通过本 地接口调用ejb,直接在内存中交互,这样

35、就能避免因网络通信所造成的各种性能开销。但 是有一点,大家必须注意,只有客户端与ejb应用在同一个jvm内运行的时候,我们才能 调用本地接口,否则只能调用远程接口。谈到这里,有同学会问什么情况下客户端与ejb应 用是在同一个jvm?简单地说只要客户端与ejb发布在同一个jboss内,我们就认为他们是 在同一个jvm 客户端 ejb 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 开发具有local接口session bean stateless local (helloworldlocal.class) public class helloworl

36、dbean implements helloworldlocal public string say (string name) return name +说:你好!世界,这是我的第一个ejb3 哦.; 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 通过local接口访问session bean 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 bean实例的两种管理技术 1.无状态bean使用实例池技术管理bean 2.有状态bean使用激活(activation)管理 bean 高级软件人才实作培训

37、专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 无状态bean访问 是1号用户 指另一个 用户 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 有状态bean的激活机制 每个用户都有自己的bean实例,相当于有多少个用户就有多少个 bean实例为之服务。如果不采取任何机制,这样必然会导致服务 器资源严重消耗,最后落个down机罢工。为了解决这个问题, ejb引入了激活机制。该机制实现的原理是这样的,在ejb服务器 需要节省资源时,就从内存中收回bean实例,将其所保持的会话 状态序列化到硬盘中,并且释放其所占有的内存。若此

38、时客户端对 ejb再次发起请求,ejb容器会重新实例化一个bean实例,并从 硬盘中将之前的状态恢复。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb调用机制 由于ejb的调用过程对开发者来说是透明的,以至于我们错误地认为 :lookup()方法返回的对象就是bean实例。实际上,客户端与 session bean交互,它并不直接与bean实例打交道,而是经由 bean的远程或本地接口。当你调用远程或本地接口的方法时,接口 使用的是存根(stub)对象。该存根实现了session bean的远程 或本地接口。它负责将方法调用经过网络发送到远

39、程ejb容器,或将 请求路由到位于本地jvm内的ejb容器。存根是在部署期间使用 jdk所带的java.lang.reflect.proxy动态生成。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 ejb调用机制 第一步第一步:客户端调用远程接口的sayhello()方法(实际上调用的是存根对象的 sayhello()方法,该存根实现了helloworld的远程接口)。 第二步第二步:方法调用经过iiop runtime被转换成corba iiop消息发往应用服务器。 第三步第三步:应用服务器接收到请求消息后,交由骨架(skeleton)处理。骨

40、架通过iiop runtime解析协议消息,并根据协议要求调用bean实例的sayhello()方法。 第四步第四步:骨架(skeleton)将sayhello()方法的返回值经过iiop runtime转换成 corba iiop应答消息发回客户端。 第五步:存根对象通过iiop runtime将corba iiop应答消息解析成返回值。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 依赖注入(dependency injection) 注入ejb: stateless remote (injection.classclass) publicp

41、ublic classclass injectionbean implementsimplements injection ejb (beanname=hellobean) localhello helloworld; ejb (beanname=hellobean) localhello helloworld; publicpublic string sayhello() returnreturn helloworld.sayhello(注入者); 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 依赖注入(dependency injection

42、) 注入数据源注入数据源: : resource(mappedname = java:/defaultmysqlds) datasource mydb; connection conn = null; try conn = mydb.getconnection(); statement stmt = conn.createstatement(); resultset rs = stmt.executequery(select studentname from student); if (rs.next() str = rs.getstring(1); rs.close(); stmt.clos

43、e(); catch (sqlexception e) e.printstacktrace(); finally try if(null!=conn catch (sqlexception e) e.printstacktrace(); 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 在在jbossjboss中配置数据源中配置数据源 defaultmysqlds jdbc:mysql:/localhost:3306/itcast?useunicode=truecharacterencoding=utf- 8 org.gjt.mm.mysql.dri

44、ver root 123456 3 100 !- transaction_read_uncommitted transaction_read_committed transaction_repeatable_read transaction_serializable transaction_serializable- org.jboss.resource.adapter.jdbc.vendor.mysqlexceptionsorter mysql 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 实体实体beanbean 它属于java持久化规范(简

45、称jpa)里的技术,实 体bean通过元数据在javabean和数据库表 之间建立起映射关系,然后java程序员就可 以随心所欲的使用面向对象的编程思想来操纵 数据库。 jpa的出现主要是为了简化现有的 持久化开发工作和整合orm技术,目前实现 的jpa规范的主流产品有hibernate、 toplink和openjpa,在jboss中采用了 hibernate 作为其持久化实现产品。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 添加添加jpajpa的配置文件的配置文件persistence.xmlpersistence.xml 根据jpa规范

46、的要求:在实体bean应用中,我们需要在应用的类路径下的meta- inf目录加入持久化配置文件persistence.xml 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 实体实体beanbean 当插入中文字符时会报: data too long for column。你可以使用下面的sql创 建数据库: create database foshanshop default charset=utf8 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 java消息服务(消息服务(java messag

47、e servicejava message service) java 消息服务(java message service,简称 jms)是用于访问企业消息系 统的开发商中立的api。企业消息系统可以协助应用软件通过网络进行消息交互 。 jms的编程过程很简单,概括为:应用程序a发送一条消息到消息服务器的某个目得 地(destination),然后消息服务器把消息转发给应用程序b。因为应用程序a 和应用程序b没有直接的代码关连,所以两者实现了解偶。如下图: 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 jmsjms中的消息中的消息 消息传递系统的

48、中心就是消息。一条 message 由三个部分组成: 头(header),属性(property)和主体(body)。 消息有下面几种类型,他们都是派生自 message 接口。 streammessage:一种主体中包含 java 基元值流的消息。其填充和读取均按顺 序进行。 mapmessage:一种主体中包含一组名-值对的消息。没有定义条目顺序。 textmessage:一种主体中包含 java 字符串的消息(例如,xml 消息)。 objectmessage:一种主体中包含序列化 java 对象的消息。 bytesmessage:一种主体中包含连续字节流的消息。 高级软件人才实作培训专

49、家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 消息的传递模型消息的传递模型 jms 支持两种消息传递模型:点对点(point-to-point,简称 ptp)和发布/订阅 (publish/subscribe,简称 pub/sub)。这两种消息传递模型非常相似,但 有以下区别: ptp 消息传递模型规定了一条消息只能传递给一个接收方。 采用 javax.jms.queue 表示。 pub/sub 消息传递模型允许一条消息传递给多个接收方。采用javax.jms.topic表 示 这两种模型都通过扩展公用基类来实现。例如:javax.jms.queue 和 javax.

50、jms.topic 都扩展自javax.jms.destination 类。 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 点对点ptp 消息传递模型 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 发布/订阅消息传递模型 高级软件人才实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 配置目标地址配置目标地址 开始jms编程前,我们需要先配置消息到达的目标地址(destination),因为只有 目标地址存在了,我们才能发送消息到这个地址。由于每个应用服务器关于目标 地

51、址的配置方式都有所不同,下面以jboss为例,配置一个queue类型的目标地 址。 queue/foshanshop jboss.mq:service=destinationmanager jboss使用一个xml文件配置队列地址,文件的取名格式应遵守*-service.xml 属性指定了该目标地址的全局jndi名称。如果你不指定 jndiname属性,jboss会为你生成一个默认的全局jndi,其名称由“queue”+“/”+目 标地址名称组成。另外在任何队列或主题被部署之前,应用服务器必须先部署destination manager mbean,所以我们通过节点声明这一依赖。 高级软件人才

52、实作培训专家高级软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 在在javajava类中发送消息类中发送消息 一般发送消息有以下步骤: (1) 得到一个jndi初始化上下文(context) initialcontext ctx = new initialcontext(); (2) 根据上下文查找一个连接工厂 queueconnectionfactory 。该连接工厂是由jms提供的,不需我们自 己创建,每个厂商都为它绑定了一个全局jndi,我们通过它的全局jndi便可获取它; queueconnectionfactory factory = (queueconnectio

53、nfactory) ctx.lookup(queueconnectionfactory); (3) 从连接工厂得到一个连接 queueconnection conn = factory.createqueueconnection(); (4) 通过连接来建立一个会话(session); session = conn.createqueuesession(false, queuesession.auto_acknowledge); 这句代码意思是:建立不需要事务的并且能自动确认消息已接收的会话。 (5) 查找目标地址: 例子对应代码:destination destination = (dest

54、ination ) ctx.lookup(queue/foshanshop); (6) 根据会话以及目标地址来建立消息生产者messageproducer (queuesender和topicpublisher都扩 展自messageproducer接口) 例子对应代码: messageproducer producer = session.createproducer(destination); textmessage msg = session.createtextmessage(您好,这是我的第一个消息驱动bean); producer.send(msg); 高级软件人才实作培训专家高级

55、软件人才实作培训专家 ! ! 北京传智播客教育 北京传智播客教育 采用消息驱动bean (message driven bean)接收消息 消息驱动bean(mdb)是设计用来专门处理基于消息请求的组件。它和无状态session bean 一样也使用了实例池技术,容器可以使用一定数量的bean实例并发处理成百上千个jms消 息。正因为mdb具有处理大量并发消息的能力,所以非常适合应用在一些消息网关产品。 如果一个业务执行的时间很长,而执行结果无需实时向用户反馈时,也很适合使用mdb。 如订单成功后给用户发送一封电子邮件或发送一条短信等。 一个mdb通常要实现messagelistener接口,该接口定义了onmessage()方法。bean通 过它来处理收到的jms消息。 package javax.jms; public inter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论