您的位置:首页 > 其它

传智播客-ejb3(2)-bean类型、jboss基本应用、本地组件和远程组件及其底层实现原理简介

2011-04-08 11:24 1491 查看
bean类型
ejb规范定义了三种bean类型:session bean,message-driven bean,entity bean。

每种类型的bean都有特定目的且可独立使用ejb服务的某个子集。bean规范类型的真正目的是防止服务的交叉装配导致的超载。session bean和message-driven bean主要用于构建用户业务逻辑,也可以说用于业务关系建模,它们都驻留在容器中,由容器来进行管理。entity bean用于对实体关系建模,由jpa管理--即由持久化供应商(例如hibernate)通过实体管理器接口进行管理。而持久化供应商是可插拔的--通过配置文件体现。

1、session bean
用于特定业务逻辑,由客户端调用。分为有状态bean(@Stateful, SFSB)和无状态bean(@Stateless, SLSB),前者无需手动编码,在客户端调用时即可自动保存状态信息;后者可通过java RMI进行本地/远程调用,还可暴露成Web Service。SLSB不维护任何状态,SFSB趋向于对多个步骤的工作流进行建模,SLSB则趋向与对常规业务进行建模. SFSB典型案例就是购物车。

2、message-driven bean
和session bean类似,也是用来处理业务逻辑,但是客户端不会直接调用message-driven bean。它是由发送到服务器的消息触发的,可用于在系统组件间进行异步消息的发送。典型的消息服务器有:IBM websphere MQ(这个很好使~个人感觉IBM的产品最大优点是业务全或者说功能全而且稳定易用~),SonicMQ, Oracle Advanced Queueing和TIBCO。

jboss基本应用
jbossAS实际上是C/S结构的服务应用。从网上down一个压缩包(例如jboss-4.2.2.GA.zip),解压缩至某目录,然后以该目录的全路径为值新建一个系统变量JBOSS_HOME,方便某些可以直接调用系统变量的应用(例如ant)。启动一般都是在bin目录下:run.bat/shutdown.bat(windows)(可以由IDE调用启动关闭)。

jboss-4.2.2.GA/server目录下有三个目录,代表三种类型的服务应用:all、default、minimal。顾名思义,all表示包括全部服务,但是启动也耗时;minimal则是省略了很多服务,也不能部署ejb应用;default,看名字就知道了,一般都用这个--IDE里创建jboss server时默认选择的也是这个。

default/deploy下是部署的ejb组件和war包--从这里可以看出,后台程序(java项目)和前台程序(java web项目)是分离的,包括开发时的任务分派,分布式应用开发思想在这里得以展现。

NOTE:
1、ejb需要打成jar包,web项目要打成war包,同时部署到jboss上才能运行。
2、开发web工程时,很可能需要添加到ejb组件jar包到类路径,以保证开发过程中编译通过且能独立调试运行该web项目;但部署到jboss后,应该把web工程,即相应的war包里类路径下的jar文件删除,不然会和部署到deploy目录下的ejb组件jar包相冲突,导致jboss对象识别混乱(MyEclipse下可能报ClassCaseException错误)。
3、jboss可以热部署,即不需要重启服务就可重新部署。不过有时如果程序仍然调用的是更改以前的内容,可以手动重启服务。

本地组件和远程组件及其底层实现原理简介
1、JNDI
JNDI是一种访问/查找机制,全称是java naming directory interface。在jboss里默认启动端口是1099。每个ejb组件部署到jboss里后,都会在JNDI注册表里注册,JNDI可视为java的一个map集合(或曰容器),例如map.put(key<jndiName>, value<class>)。可以通过下述流程检查ejb组件是否已组册到jboss的JNDI中:jboss首页--点击【JMX console】--点击【service=JNDIView】--点击【java.lang.String.list()】下的invoke按钮--检查相应位置是否有ejb组件的JNDI注册信息。

2、@Local
(1)当ejb组件和web工程在同一个jvm内(例如jboss jvm)信息交互时使用该注解。
(2)容器读取@Local注解的类时,返回的实际上是一个代理对象,与@Remote返回的对象相比,主要是不包含套接字(socket)访问信息。
(3)数据交互速度快:因为是本地组件,不涉及网络底层通信-不走套接字编程,不用建立一些诸如发起连接、读写数据等基本操作,不占用基本带宽;不用串行化数据,直接在内存内交互。

3、@Remote
(1)当ejb组件和web工程不在同一个jvm内(例如jboss jvm和Application jvm)信息交互,需要进程间通信的时候使用该注解。
(2)ejb部署@Remote组件时,会产生两个代理对象:一个是stub(存根)对象,返回给客户端,同时还包含了客户端socket代码信息;一个是skeleton(骨架)对象,包含服务端socket代码信息,既与stub对象进行信息交互,也与ejb组件交互。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: