EJB-03:SessionBean

一、什么是会话Bean(Session)?

  会话Bean:

  (1) 会话Bean是EJB中一种用来建模、业务逻辑/业务流程的EJB类型。

  (2) 会话Bean实例的生成是客户端调用的结果。

  (3) 会话Bean接受客户端的请求,并作出响应,是一个业务处理对象(控制类,OO中类的一种(边界类,实体类,控制类))

  (4) 会话Bean的存活时间很短。

常用的EJB类型:SessionBean,EntityBean,MessageDrivenBean,Entity Bean,JPA。

1、SessionBean(Statless/Statfull)

    无状态的SessionBean是不会保存的信息的和状态,无状态的SessionBean是可以重用的,而不是被立刻销毁

    有状态的SessionBean只为一个用户来服务。

2、MDB(Message Driver Bean)消息驱动Bean,可以进行异步的编程

3、Entity Bean 访问数据库,已经被JPA(JAVA持久化API)替代。

4、JPA基于ORM方式来实现对数据库的访问

 

1.SessionBean:

    用于对业务建模,表示过程。流程(动词)

    作为门面(Facade)。

    负责接受远程访问,并操作EntityBean。同步的调用。

2.EntityBean:

    生命周期:持久化。过程结束后,数据仍存在。

    用于对数据建模,表示名词。

    SessionBean与EntityBean组成动宾关系。

    争论焦点:O/R较复杂。

    一般不直接接受远程访问。

3.MessageDrivenBean:

    用于封装业务过程,动词。

    为了完成异步调用:客户调用,消息服务器缓存指令,发送消息给客户端,消息服务器分发消息,Bean执行。

    责任同SessionBean,完成异步调用。

 

二、SessionBean的类型:

  (1) stateless Session Bean

(2) stateful Session Bean

 

(一)无状态SessionBean(Statless)

  (1) 无状态Session Bean单个方法调用就能完成一个完整的业务流程

(2) 无状态Session是可以被重用,不能被客户端并发共享,只可以串行共享,并不保留客户端方法调用后的的状态,而是直接返回。

(3) 无状态的SessionBean是可以池化的(pooling),以优化性能,用以被多个客户共享。

 

无状态SessionBean的生命周期

 

如果实例不存在,就会调用构造方法,然后调用资源注入方法,接着会调用有@PostConstruct标注的方法,在销毁时会调用有@PerDestroy标注的方法,

然后销毁对象,如果实例存在就会从Bean实例池中取出实例并调用方法。

 

回调方法是基于事件机制的。

 

生命周期回调方法的规则

1、对于直接定义在Bean中的回调,其格式应该是public void <method()>,也就是直接写在SessionBean中。

2、对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void <method(InvocationContext context)>

java.interceptor.InvocationContext,提供了调用的上下文信息。只在SessionBean类上加上@Interceptors(Xxxx.class)制定定义了回调方法的类。

3、回调方法不能够抛出已检查异常,但可以抛运行时异常。

 

在创建实例并注入资源之后,会回调这个方法。

@PostConstruct

public void constructed(){}

 

在销毁对象时回调这个方法

@PerDestroy

public void destroy(){}

 

(二)有状态的SessionBean(Statful)

 

有状态的SessionBean只为一个客户端服务,不能共享,并且会保留方法调用后的状态。

  (1) 多个方法调用才能完成一个业务处理流程;

  (2) 需要保留客户端的状态

  (3) 不被多个客户共享。

当有状态的SessionBean暂时不被使用时,就会被存储到缓存当中,也就是被存到虚拟内存或者是将信息同步到Session数据库中(Session数据库是应用服务器所提共的小型数据库,用来保存Session的信息,多应用服务器共享Session数据库,同步Bean的信息,达到集群处理)。

 

swap out passivation钝化过程,保存SessionBean的状态,在SessionBean处在事务中时是不会进行钝化的。

swap in activation激活过程,提取保存的SessionBean到内存中,可以继续被客户端使用。

 

有状态的Session,会保存成员变量(没有加transient关键字,以及串行化的类型和基本类型),也会保存其他的SessionBean的引用。

 

对有状态的SessionBean中有transient属性时,就需要在Bean中提供激活的方法也就是

@Statful

Test implements TestRemote{

   transient private int a;

   @PostActivate

   public void activate(){

  a=5;

   }

}

 

在SessionBean中实现事务处理时要实现SessionSynchronization接口。

 

  关于有状态会话Bean与无状态会话Bean的比较:

  Stateless Session Bean

  (1) EJB容器可以预先实例化多个无状态会话Bean的实例,组成一个pool;

  (2) 当客户请求调用时,容器可以任选一个实例处理请求;

  (3) EJB容器可以依照请求量的大小来调整pooling中实例的个数;

     对于客户端来讲,这些stateless Session Bean毫无区别。

  (4) EJB容器可以通过pooling来达到使用少量实例来应对大量的请求。

  Stateful Session Bean

  对于有状态的会话Bean,不能够同时被多个客户所共享。

  如果要让stateful Session Bean能够同时服务多个客户,就要使用Swapping。

  钝化:将会话Bean中客户状态钝化到存储设备(swap out)。

  激活:将存储设备中的客户状态读回到会话Bean中(swap in)。

使用有状态会话Bean时如何维护客户状态?

  (1) 在默认状况下,可以不用考虑,容器会自动维护客户端的状态

  Tips:容器自动维护的状态

  A、非transient修饰的属性

  B、EJB中的其他业务接口

  C、EJB中的home接口

  D、EJB中的会话上下文,事务对象

  E、JNDI上下文(Context)

  (2) 对于一些无法采用默认的swap机制钝化、激活的状态,应该采用回调方法手动实现激活和钝化。

 

  1、何时需要使用有状态的会话Bean?

  需要跨多个方法完成某个业务处理流程,并且需要保持客户端状态。

  2、有状态会话Bean能否实现pooling?

  可以,但需要swping,不停地激活、钝化。

  3、无状态会话Bean的pooling性能优于有状态会话Bean的pooling(swap有I/O瓶颈)。

  4、无状态会话Bean可以有属性,但是属性的值被所有的客户端共享。

 

在厂商的部署描述中可以配置EJB的实例池,可以一次创建多个EJB的实例。

SessionBean

 

SessionBean接受客户端的请求,并作出响应,是商业过程处理对象。

 

无状态SessionBean(Statless)

 

无状态Session是可以被重用,不能被客户端并发共享,只可以串行共享,并不保留客户端方法调用后的的状态,而是直接返回。

无状态的SessionBean是可以池化的,以优化性能。

 

无状态SessionBean的生命周期

 

如果实例不存在,就会调用构造方法,然后调用资源注入方法,接着会调用有@PostConstruct标注的方法,在销毁时会调用有@PerDestroy标注的方法,然后销毁对象,如果实例存在就会从Bean实例池中取出实例并调用方法。

 

回调方法是基于事件机制的。

 

生命周期回调方法的规则

1,对于直接定义在Bean中的回调,其格式应该是public void <method()>,也就是直接写在SessionBean中。

2,对于为Bean类单独提供(单个或多个)回调监听而言。其格式是public void <method(InvocationContext context)>

java.interceptor.InvocationContext,提供了调用的上下文信息。只在SessionBean类上加上@Interceptors(Xxxx.class)制定定义了回调方法的类。

3,回调方法不能够抛出已检查异常,但可以抛运行时异常。

 

在创建实例并注入资源之后,会回调这个方法。

@PostConstruct

public void constructed(){}

 

在销毁对象时回调这个方法

@PerDestroy

public void destroy(){}

 

有状态的SessionBean(Statful)

 

有状态的SessionBean只为一个客户端服务,不能共享,并且会保留方法调用后的状态。

 

当有状态的SessionBean暂时不被使用时,就会被存储到缓存当中,也就是被存到虚拟内存或者是将信息同步到Session数据库中(Session数据库是应用服务器所提共的小型数据库,用来保存Session的信息,多应用服务器共享Session数据库,同步Bean的信息,达到集群处理)。

 

swap out passivation钝化过程,保存SessionBean的状态,在SessionBean处在事务中时是不会进行钝化的。

swap in activation激活过程,提取保存的SessionBean到内存中,可以继续被客户端使用。

 

有状态的Session,会保存成员变量(没有加transient关键字,以及串行化的类型和基本类型),也会保存其他的SessionBean的引用。

 

对有状态的SessionBean中有transient属性时,就需要在Bean中提供激活的方法也就是

@Statful

Test implements TestRemote{

   transient private int a;

   @PostActivate

   public void activate(){

  a=5;

   }

}

 

在SessionBean中实现事务处理时要实现SessionSynchronization接口。

java -Dorg.omg.CORBA.ORBInitialHost=192.168.12.41

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ejb-.xml 是 EJB (Enterprise JavaBeans) 的配置文件,用于配置 EJB 组件的属性和行为。它的具体内容取决于你的 EJB 组件的实现和需要。 以下是一个 ejb-.xml 文件的基本结构: ```xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 3.0//EN" "http://java.sun.com/dtd/ejb-jar_3_0.dtd"> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> <!-- EJB 模块的描述 --> <description>My EJB Module</description> <!-- EJB 组件的声明 --> <enterprise-beans> <!-- Session Bean 的声明 --> <session> <!-- Session Bean 的名称 --> <ejb-name>MySessionBean</ejb-name> <!-- Session Bean 的类型 --> <ejb-class>com.example.MySessionBean</ejb-class> <!-- Session Bean 的事务属性 --> <transaction-type>Container</transaction-type> <!-- Session Bean 的声明周期 --> <stateless/> <!-- Session Bean 的 JNDI 名称 --> <ejb-local-ref> <ejb-ref-name>ejb/MySessionBeanLocal</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local>com.example.MySessionBeanLocal</local> </ejb-local-ref> </session> <!-- Entity Bean 的声明 --> <entity> <!-- Entity Bean 的名称 --> <ejb-name>MyEntityBean</ejb-name> <!-- Entity Bean 的类型 --> <ejb-class>com.example.MyEntityBean</ejb-class> <!-- Entity Bean 的主键 --> <prim-key-class>com.example.MyEntityPK</prim-key-class> </entity> <!-- Message Driven Bean 的声明 --> <message-driven> <!-- Message Driven Bean 的名称 --> <ejb-name>MyMessageDrivenBean</ejb-name> <!-- Message Driven Bean 的类型 --> <ejb-class>com.example.MyMessageDrivenBean</ejb-class> <!-- Message Driven Bean 的消息目的地 --> <activation-config> <activation-config-property> <activation-config-property-name>destinationType</activation-config-property-name> <activation-config-property-value>javax.jms.Queue</activation-config-property-value> </activation-config-property> <activation-config-property> <activation-config-property-name>destination</activation-config-property-name> <activation-config-property-value>queue/MyQueue</activation-config-property-value> </activation-config-property> </activation-config> </message-driven> </enterprise-beans> </ejb-jar> ``` 在这个 ejb-.xml 文件中,你需要指定 EJB 模块的描述、EJB 组件的声明和各个组件的属性。这个文件使用 XML 格式编写,具体的格式和内容可以参考 EJB 规范文档和相关教程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值