当前位置 博文首页 > 快乐的小三菊的博客:EJB 简介

    快乐的小三菊的博客:EJB 简介

    作者:[db:作者] 时间:2021-07-28 20:46

    背景:

    ? ? ? ?EJB sun JavaEE 服务器端组件模型,设计目标与核心应用是部署分布式应用程序。凭借 java 跨平台的优势,用 EJB 技术部署的分布式系统可以不限于特定的平台。EJB (Enterprise JavaBean) 是 J2EE 的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。 在 J2EE 里,Enterprise Java Beans(EJB) 称为 Java 企业 Bean,是?Java?的核心代码,分别是会话 BeanSession Bean),实体 BeanEntity Bean)和消息驱动 BeanMessageDriven Bean)。

    会话 Bean:

    ? ? ? ?会话 BeanSession bean)在业务逻辑的实现中使用的频率很高,它在 EJB 技术中成了很重要的一部分。 Session bean 有以下几种特征:

    ? ? ? ?1、Stateless:这种 Session bean 在方法调用中不包含会话状态,任何实例都可以被任意的客户端调用。

    ? ? ? ?2、Stateful:这种 Session bean 包含会话状态,一个实例只能被一个客户端持有。

    ? ? ? ?3、Singleton:单例 session bean,只存在一个实例,并被所有客户端共享,并支持同步调用。

    消息驱动 Bean:

    ? ? ? ?消息驱动 Bean(Message-driven bean(MDB))?通过使用 JMS 接收异步消息来与外部其他系统集成。这个组件模型主要通过消息中间件 (MOM) 用来集成系统,MDB 通常带业务逻辑给会话 Bean,现在开发一个 EJB 非常的简单,一个简单的 java 类和一个标注就能构成一个 EJB,如下所示:

    @Stateless
    publicclass EJBTest {
    
    
        public Book methodOne(Long id) {
            // todo
        }
    
    
        public Book methodTwo(String param) {
            // todo
        }
    
    }

    EJB 容器功能:?

    ? ? ? ?EJB 是一个服务器端的组件,一个简单的 java 类和一个标注就能构成一个?EJB,那 EJB 与普通 java 类的区别就是什么呢?那就是 EJB 必须要运行在 EJB 容器中,EJB 容器提供 EJB 所需要的运行环境,EJB 容器能够提供如下的一些功能:

    ? ? ? ?1、远程客户端通讯Remote client communication):?不需要编写额外的代码,一个 EJB 客户例如:另一个 EJB、一个用户接口,一个进程等等)端就可以通过标准的协议来远程调用方法。

    ? ? ? ?2、依赖注入Dependency injection):容器可以注入各种资源到 EJB 中(例如:JMS destinations andfactories, datasources,其他 EJB, 环境变量等等)。

    ? ? ? ?3、状态管理State management):对于有状态会话 Bean,容器管理着它们的状态。你可以为你的客户端保持状态。

    ? ? ? ?4、Pooling):对于无状态会话 Bean 和消息驱动 Bean,容器池化一些实例,这些实例被多个客户端共享。每次调用完毕,实例被放回到池中,而不是被销毁。

    ? ? ? ?5、组件生命周期Component life cycle):容器可靠地管理着组件的生命周期

    ? ? ? ?6、消息Messaging) :容器允许 MDB 侦听消息源并消费消息,并不使用太多的 JMS 探测

    ? ? ? ?7、事务管理Transaction management):通过声明式事务管理, EJB 可以使用标注来告诉容器它所需要的事务级别,容器管理着事务的提交与回滚。

    ? ? ? ?8、安全Security):EJB 可以指定类或者方法级别的访问控制,要求强制验证用户或者角色

    ? ? ? ?9、并发同步Concurrency support):除了单例,一些并发申明是需要的,其他所有类型的 EJB 是默认线程安全的。你可以开发性能好的应用而不必担心线程问题。

    ? ? ? ?10、拦截器Interceptors):切入点( Cross-cutting concerns)可以放到拦截器中,容器会自动调用它。

    ? ? ? ?11、异步方法调用Asynchronous method invocation) :在 EJB 中,可以不使用消息而实现异步调用

    会话 Bean 子类型:

    ? ? ? ?会话 Bean 存在三种子类型:StatelessStateful Singleton,用于创建不同类型的会话。

    Stateless:

    ? ? ? ?无状态会话 Bean 适用于只需单个请求会话即可完成的业务过程( 事务处理必须在一个方法中结束 )。这样,EJB 组件不需要维护方法调用间的状态变更信息。为了实现有效的 Bean 实例处理,EJB 容器经常会使用实例池技术。由于无状态会话 Bean 不含会话状态,因此同一无状态会话 Bean 类的所有实例对于客户而言都是等效的。而且无状态会话 Bean 不保留历史会话信息,所以它对于调用其本身的客户也并不关注。因此,任何无状态会话 Bean 都能够服务任何客户请求。因为这些无状态会话 Bean 都是一样的。?

    Stateful:

    ? ? ? ?有状态会话 Bean 适用于需要若干请求形成才可完成的业务过程。这样,EJB 组件就需要维护方法调用间的状态变更信息.?在有状态会话 Bean 中各个 Bean 实例中存储的状态信息仅是单个客户的。如果和无状态会话 Bean 的处理一样,只是简单的将实例全部放置实例池中,当大量的并发客户操作时,内存中运行的有状态会话 Bean 实例就会过多而失去控制。

    Singleton:

    ? ? ? ?Singleton EJB 中会话 bean 的一种,容器会确保它在每个应用中只会实例化一次。它实现了单例模式。Singleton 在所有客户端之间共享状态。Singleton 是不能感知群集的。集群是一组容器紧密地合作(共享相同的资源,EJB 等等)。因此,在某些情况下,需要在好几台机器上部署分布式容器集群,每个容器将有它自己的 Singleton 实例。

    总结:

    ? ? ? ?有状态的 Bean 带来了支持会话状态的好处但同时付出了性能的代价。无状态 bean 具有更好的性能,但却又不具备与客户端的亲合力。struts2 中将 Action ActionForm 合二为一,就有了状态,因为每次请求都创建一个新的实例,所以没有线程安全问题,而 struts1 就不能这么做了,struts1 Action 采用的是单例模式,仅有 Action 的一个实例来处理所有的请求,所以使用 struts1 的时候要特别小心,要保证 Action 的资源是线程安全最好采用无状态。

    有关消息驱动Bean:

    ????????消息驱动 bean 是一种通过消息方式为外界提供服务的组件。MDB 和它的使用者之间是一种松散耦合的关系.由于 MDB 组件在使用的过程中,其客户并不拥有 MDB 组件的远程引用,而是直接将消息发送到特定的队列中,因而用户的调用并不强求 MDB 组件的运行,在 MDB 组件没有运行的情况下,客户发送的请求数据会临时保存到消息队列中,当 MDB 组件加载后,消息队列中的调用消息才能得到处理。javaee 规范并没有规定 MDB 将处理结果返回给消息调用者的方式,但是通常情况下 MDB 组件是将处理完的结果以消息方式发送到特定结果队列中,如果客户程序没有运行,结果会临时存放在消息队列中,直到客户程序启动,结果队列中的消息才能得到处理。

    ? ? ? ?MDB 可以和两种消息队列关联,如果和 Topic 型的队列关联,则客户发送到队列中的消息,会依次广播给所有的 MDB 组件,所有的 MDB 组件会得到相同的消息。

    ? ? ? ?MDB 组件和具体的业务逻辑无关,从特定的消息队列中获得消息,消息内容要在 MDB onMessage 方法中处理,具体的而业务逻辑通常委托给其他的 EJB 组件。

    有关实体Bean:

    ????????实体 Bean 的主要作用就是维护数据的持久性,???实体 Bean 的主要作用就像开始时说的一样是维护数据的持久性;会话 Bean 可以提供实现业务逻辑的方法;消息驱动 Bean 是基于 JAVA 消息技术的 EJB 对象,可以与 JMS 程序相配合,实现对消息列队的操作。

    cs