首页 > 代码库 > EJB3

EJB3

Ejb概念

Ejb3.0定义了很多Annotation,覆盖了众多与持久化相关的概念,比如Bean的类型,依赖注入,事务管理,安全,回调,O-R映射,关系等等

 

Ejb的几个特性

依赖注入(DI

通过定义@Inject@EJB@Resourceannotation,这些依赖关系现在可以由容器来注入到EJB

可选的回调机制

       开发者们现在可以仅仅实现他们感兴趣的那些回调方法了,通过定义@PostConstruct@PreDestroy@PrePersist或者PostPersist。开发者们可以映射任何JavaBean或者回调类得方法,让他们接收这些文件

简化的持久化模型和改良的查询

可以脱离容器使用

什么情况下需要企业Bean

       企业Bean运行在Ejb容器中,企业Bean实际上就是一个封装了业务逻辑的java

Why Ejb

最重要的理由:分布式!分布式对象之间互相协作,完成特定的业务功能,分布式对象之间应实现分布透明性(或者位置透明性),即在客户端代码中无需指定分布式对象的位置(通过配置来解决)

部署的服务放在不同的机器上,在互相的协作上,支持事务

分布式对象之间的事务支持(RMI不支持)远程方法调用

       应用程序需要支持不同客户端,只需要少量的代码,就可以让远程客户端访问到企业Bean,如果你的应用需要进行分布式部署,如果你的分布式对象需要支持事务,如果你的关键逻辑需要能够支持多种不同类型的客户端,那么Ejb将会是一个很好的选择.当在开发企业Bean之前,首先要做的第一个决定是:Ejb要支持什么样的客户端

远程客户端:客户端和其调用的Ejb对象不在一个JVM进程中

本地客户端:客户端和其调用的Ejb对象在一个JVM进程中WebService客户端

远程方式:客户端与服务器之间通讯时,数据需要序列化之后用传值的方式传输

本地方式:客户端与服务器之间通讯时,数据直接用传址的方式传输

 

分布式对象之间的事务支持

会话bean(Session Bean)

即从客户端获得Ejb对象开始,然后调用Ejb方法(可以多次),直到客户端生命周期结束,或者客户端释放了Ejb对象为止,成为一次会话,随着会话的终止,Ejb对象也有可能被Ejb容器销毁

什么叫有状态的会话Bean

              Ejb能够为同一个客户端在多次请求之间保持状态信息

 

针对不同的客户端,服务器提供的原理不一样,不同的客户端,造成的性能不一样

新建Ejb项目过程

下载jboss解压在D

启用myeclipse8.0,加载jboss

新建一个Ejb工程(服务端)

新建一个java工程(客户端),然后引入D:\jboss-4.2.3.GA\client的所有jar包和Ejb工程的接口包,在src目录下新建jdni.properties文件,内容如下

java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory

java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces

java.naming.provider.url=localhost

 

案例1,有状态的会话Bean和无状态的会话Bean的区别

       有状态会话bean:每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即有状态;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean

无状态会话beanbean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

赞同

案例2,远程客服端和本地客户端的区别

客户端跟调用Ejb对象是否在同一个 JVM进程里面

访问方式:传值还是传引用

远程访问方式:表示通过socket连接,进行系列化,实现serializable接口进行传输

本地访问方式:因为ejb对象和客户端是在同一个进程里面,他们使用的是同一块内存,所以他们传递参数是引用

本地客户端:

|

远程客户端:

 

案例3,一个ejb实现多个接口,ejb组件需要适合不同客户端需要。

设计不同接口,设计思想要避免胖接口,例如需要用远程访问接口,同时也需要用本地访问接口。给ejb定义类型,例如@stateless。注解是怎么定义的,参考ejb3.0规范,注解放在类得前面。在java运行时,通过java的反射机制就可以得到这个类的前面定义的是什么的注解

案例4,  Ejb第三种类型bean.MDB消息驱动bean

       通过Jms消息驱动执行的beanJmsjava异步编程服务

       Java消息服务:客户端与客户端的消息是通过中间的服务器传输的,消息的发出和接收是不同步

p2p模型:

P2P模型中,有下列概念:消息队列(Queue)、发送者(Sender)、接收者(Receiver)。每个消息都被发送到一个特定的队列,接收者从队列中获取消息。队列保留着消息,直到它们被消费或超时。

      

l  每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)

l  发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列。

l  接收者在成功接收消息之后需向队列应答成功

如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模型。一卡通:刷卡量大,很多信息需要传到各个在线终端,终端处理能力有限,接收信息不需要同步,所以可以采用p2p模型

 

 

pub/sub模型:

      

Pub/Sub模型中,有下列概念:主题(Topic)、发布者(Publisher)、订阅者(Subscriber)。客户端将消息发送到主题。多个发布者将消息发送到Topic,系统将这些消息传递给多个订阅者。

l  每个消息可以有多个消费者

l  发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅之后,才能消费发布者的消息,而且,为了消费消息,订阅者必须保持运行的状态。

当然,为了缓和这种严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

       如果你希望发送的消息可以不被做任何处理、或者被一个消费者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

聊天室,某个客户端把消息发给服务器,服务器就把消息发给所有的客户端

 

消息的消费

JMS中,消息的产生和消费是异步的。对于消费来说,JMS的消费者可以通过两种方式来消费消息。

l  同步订阅者或接收者调用receive方法来接收消息,receive方法在能够接收到消息之前(或超时之前)将一直阻塞。

l  异步订阅者或接收者可以注册为一个消息监听器。当消息到达之后,系统自动调用监听器的onMessage方法。

 

案例5Web Service

无状态的ejb才可以发布为webservice,方法前面要加@webMethod注解,类前面要加@webService注解

传递方式,是通过soap格式传输,传递的是html

EJB3