目录
绪论
中间件定义
- 一种独立的软件或者服务,物联网服务可以借助中间件在不同的系统之间共享资源。它能提供透明的数据传输能力,承担物理空间到信息空间的映射,实现对物理对象的感知和信息获取、清洗、融合等。
- Software that connects two otherwise separate applications.
- 是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源;中间件位于客户机/服务器的操作系统之上,管理计算资源和网络通信
- 左中右的中:位于应用系统间, 提供通信服务
- 上中下的中:位于应用系统和操作系统间,提供应用编程接口(抽象)并管理计算资源
分布式软件结构
- 两层结构
- 客户程序直接访问数据库,用户界面代码和业务逻辑代码交织在一起
- 问题
- 客户端负担重
- 客户端可移植性不好
- 系统可维护性不好
- 数据安全性不好
- 三层结构
- 将业务逻辑代码移到中间层
- 客户程序只能通过中间层间接地访问数据库,即
- 降低了客户端的负担
- 改善了其可移植性
- 提高了系统的数据安全性
- 业务逻辑代码与用户界面代码相对独立,也在很大程度上提高了系统的可维护性
分类
- 消息中间件(MOM:Message-oriented Middleware)
- 数据库中间件(Database Middleware)
- 远程过程调用中间件(RPC: Remote process Call)
- 对象请求代理中间件(ORB: Object Request Broker)
- 事务请求代理中间件(TP Monitor: Transaction Process Monitor)
物联网中间件
- 功能
- 屏蔽异构性
- 计算机硬件之间的异构性
- 物联网异构性
- 实现互操作
- 实现各应用系统和应用平台之间互操作
- 信息预处理
- 过滤海量信息,统计分析融合成有意义事件再传输给应用系统
- 可扩展性
- 屏蔽异构性
- OPC
- OPC是连接数据源(OPC服务器)和数据使用者(OPC应用程序)之间的软件接口标准。
- CEP
- 复杂事件处理(Complex Event Progressing)技术是一种新兴的基于事件流的技术
- 通过分析事件间的关系,利用过滤、关联、聚合等技术最终由简单事件产生高级事件或商业流程。
- 复杂事件处理(Complex Event Progressing)技术是一种新兴的基于事件流的技术
中间件的工作原理
构件
- 接口:定义分布式对象能力的约定。构件之间可见的只有接口,通常是跨语言的
- 数据类型:分布式对象交互需定义在分布式对象之间传输的数据类型。需要一种独立于语言和平台的数据类型系统
- 编组与解组:串行化流数据与程序员处理的有类型数据之间需 编组与解组
- 对象句柄:对象句柄是对远端分布式对象的引用
- 对象创建:创建一个新的分布式对象实例的机制
- 对象调用:分布式对象的调用的机制
中间件
- 抽取软件的共性成分由系统级软件完成, 向开发人员屏蔽系统低层的复杂度,从而在高层保持整体复杂度的相对稳定
- 依据所抽取出的应用软件中的不同共性设计与实现不同类型的中间件
- 数据访问中间件:支撑应用程序访问数据库,对异构环境下的数据库实现联接
- 消息中间件:为应用程序提供发送和接收异步消息支持
集成中间件
- 功能
- 提供构件运行环境
- 管理构件的实例及其生命周期、管理构件的元信息等
- 提供互操作机制
- 开发人员在开发与调用分布式对象时,无需自己编写处理底层通信的代码
- 提供公共服务
- 公共服务又称为系统级服务,指由中间件(应用服务器 )实现的、应用程序使用的软件系统中共性程度高的功能成分
- 事务服务
- 安全服务
- 命名服务
- 持久性服务
- 消息服务
- 分布式垃圾回收服务
- 资源管理服务
- 公共服务又称为系统级服务,指由中间件(应用服务器 )实现的、应用程序使用的软件系统中共性程度高的功能成分
- 提供构件运行环境
Stub/Skeleton
- 客户程序将调用请求发送给客户端桩,对于客户程序来说,桩就是服务程序在客户端的代理
- 客户端桩负责将远程调用请求进行编组并通过通信总线发送给服务端
- 调用请求经通信总线传送到服务端框架
- 服务端框架将调用请求解组并分派给真正的远程对象实现(服务程序)
- 服务程序完成客户端的调用请求,将结果返回给服务端框架
- 服务端框架将调用结果编组并通过通信总线发送给客户端桩
- 客户端桩将调用结果解组并返回给客户程序
- 客户程序得到调用结果
J2EE简介
构件/容器结构
- 构成J2EE 应用系统的构件都运行在某种J2EE 容器中
- 容器
- 为构件提供公共服务
- 为构件之间的交互或者是构件访问后台数据提供支持
- 提供运行环境
J2EE应用构件
- 客户端构件
- Applets
- Applet 是具有图形用户界面的特殊的Java 类
- 运行在Web浏览器中
- 运行在支持Applet编程模型的容器中
- 在J2EE 应用中Applets 一般用来提供用户界面
- Applet类自身不包含main 入口函数,它被容器调度执行
- 无需安装,从Web上下载运行在浏览器上
- Application Clients
- Application Client 指有图形用户界面的独立 Java 程序
- 与applet 不同,Application Client 通常包含main 入口函数且需要在 每个使用的客户端 机器上安装
- 很多 J2EE 应用中均不使用Application Client 或 Applet 作为客户端程序,客户端的用户界面一般由Web 页面来提供
- Applets
- 服务器端构件
- Web构件
- Servlets
- JSP
- 一类特殊的HTML文档
- 通过在HTML 文档中嵌入JSP 特定的标签来允许程序员在页面中加入Java 代码来动态生成页面内容
- EJB构件
- 实体构件
- 会话构件
- 消息驱动构件
- Web构件
J2EE应用开发
- 应用程序基本结构
- Java目标文件:
.jar
文件,用来打包EJB构件、Application Client以及它们需要的辅助Java目标文件 - Web目标文件:
.war
文件,用来 打包Web 构件(Servlet、JSP)以及静态页面相关的文件(如HTML 文档、图片等) - 企业目标文件:
.ear
的文件, 用来打包完整的J2EE 应用
- Java目标文件:
- 一个完整的J2EE应用中可以包含若干个Java目标文件和若干个Web目标文件
- 在打包 Java 目标文件、Web 目标文件与企业目标文件时都需要提供相应的部署描述符
- 部署描述符
- Deployment Descriptor,简称DD
- 一个布署描述符是一个XML格式的文件,该文件中描述了当前模块中所包含的内容(构件或模块)所需要的环境
- EJB 模块的布署描述符——
ejb-jar.xml
- 同一EJB 模块中的所有EJB 构件共享该模块的布署描述符
- 描述每一个EJB 构件的Home接口、 Remote 接口以及真正提供服务的类的名字
- 描述构件类型及需要容器提供的服务:如果是Session Beans,说明是哪种类型的Session Bean;如果是Entity Bean,说明是否需要容器提供的 持久性管理服务及相关的信息;说明该EJB 是否需要由容器来控制事务,如果需要,怎样控制;说明该EJB 的安全控制策略等等。
- 当这些相关的特性发生变化时,可以不修改EJB 的源程序,而仅通过修改部署描述符就可以使得EJB 去适应新的环境。
- Web 模块的布署描述符——
web.xml
- 同一Web 模块中的所有构件共享该模块的布署描述符
- 首先描述当前模块包含的构件(包括Servlet、JSP、表态页面等);
- 为当前模块中的构件说明安全控制规则;
- 由于J2EE 应用的Web 模块中经常需要配置应用使用的用户认证方式,因为在典型的J2EE 应用中,客户端通常通过浏览器直接访问Web 模块中的构件,Web 模块中的构件首先与访问者接触,因此通常在Web模块中完成对用户身份的认证。
- J2EE 应用的布署描述符——
application.xml
- 描述当前应用中包含的所有模块
- 还可能定义应用使用的安全性角色
- MVC
思考题
- J2EE 应用中构件/容器能够为应用构件提供哪些好处?
- 为应用构件提供公共服务
- 为应用构件之间的交互或者是应用构件访问后台数据提供支持
- 提供应用构件运行环境
- 组成 J2EE 应用的应用构件主要有哪几种?每种应用构件在J2EE 应用中的基本作用是什么?
- 两种:客户端构件和服务端构件
- 基本作用:
- 客户端构件:提供图形用户界面,调用后台接口
- 服务端构件:提供数据服务、业务逻辑等
- 请简单描述 J2EE 应用程序的基本结构,说明布署描述符的主要作用
- 基本结构:Java目标文件、Web目标文件、企业目标文件和部署描述符
- 部署描述符作用
- 描述当前模块中所包含的内容(构件或模块)所需要的环境
- 描述构件类型及需要容器提供的服务
J2EE-EJB构件基础
EJB构件概述
- EJB 构件是由公共服务框架自动管理的分布式的服务端商业构件
- 分布式对象技术-提供分布式对象的支持
- 服务端构件技术-提供服务端构件管理的支持
- CTM(ComponentTransactionMonitor)技术-提供公共服务框架的支持
- 特点
- 公共服务框架
- 提供大量系统级服务
- 开发者关注商业逻辑实现,提高开发效率
- 平台独立性
- 沿袭了JAVA的平台无关性
- 封装特性
- 定义标准服务API 来封装现有的基础性服务
- 可定制性
- 修改EJB 构件的运行时配置以满足特定用户的需求
- 协议无关性
- 支持客户端通过多种EJB 访问EJB 构件
- 通用性
- 方便支持不同规模的应用系统,即可以在任何时间增加客户系统,而不需修改核心的应用系统
- 系统资源可伸缩性
- 公共服务框架
EJB与Java Bean的比较
- 用途及功能
- EJB 构件通常用于服务端应用开发
- Java Bean 构件通常用于客户端应用开发或作为服务端EJB 构件的补充
- Java Bean 不能使用Java 企业版平台提供的公共服务框架的支持
- 部署&定制
- EJB 构件是可布署的,即EJB 构件可以作为独立的软件单元 被布署到EJB 应用服务器上,是应用构件
- Java Bean 是开发构件,不能被部署为独立的单元
- EJB 构件是部署时可定制的
- Java Bean 构件的定制通常仅发生在开发阶段,部署时不能对其进行定制
- 远程访问能力
- EJB 构件是分布式对象,可以被客户应用或者其它EJB构件进行远程访问
- 普通的Java Bean 构件只能在其构成的应用中使用,不能提供远程访问的能力
- 终端可见性
- EJB 构件是服务端构件,运行在服务端,没有人机交互界面,对终端用户不可见
- 部分JavaBeans 构件对终端用户可见,如GUI 应用中 使用的按钮构件等
EJB体系结构
- EJB容器
- EJB 容器为EJB 构件提供运行环境并管理运行于其中的EJB
- EJB 容器为EJB 的执行提供系统级的服务
- EJB服务器
- EJB 服务器是遵循EJB 定义的构件模型的CTM 实现,一个EJB 服务器可以包含一个或多个EJB 容器,EJB 服务器为EJB 容器的运行提供公共服务框架。
- EJB客户端
- EJB 客户端泛指调用EJB 构件提供业务操作的软件实体,EJB 构件的客户端可以有多种形式
- 可以是独立的Java程序也可以是其他EJB
- EJB 客户端泛指调用EJB 构件提供业务操作的软件实体,EJB 构件的客户端可以有多种形式
- Enterprise Java Bean
- 开发者实现的核心构件EJB
- 是EJB 客户端所调用的操作的真正实现者
- 可以被部署到EJB 应用服务器上,用来组装大型的EJB 应用
- Home接口
- Home 接口(Home Interface)包含EJB 生命周期管理相关的方法,客户程序使用Home接口创建或删除EJB 的实例
- 每个Home 接口都依赖于一个类(bean)来提供 Home 接口中约定的功能,该类由容器自动生成,程序员只需定义接口
- Remote接口
- Remote 接口包含EJB 实现的商业方法的声明, 它实际上约定了EJB 所提供的服务
- 实现接口的类由容器自动生成,但真正的操作是由EJB构件实现的
- 客户程序只能通过Remote 接口来间接地访问EJB 实现 的商业方法,不能直接进行调用
- LocalHome/Local接口
LocalHome = Home, Local = Remote
- 与Home接口和Remote相比,本地接口的不同之处在于 客户应用通过本地接口发起的调用是进程内的本地调用, 因此比远程接口调用有更高的效率
- 每个EJB 构件都有一对对应的Home 接口与 Remote 接口和/或一对对应的LocalHome接口与 Local 接口,从这种意义上讲,我们通常认为一个完整的EJB 构件包含:
- Enterprise Bean类
- 实现业务逻辑
- Home接口
- 定义创建、查找EJB的方法
- Remote接口
- 定义在bean中实现业务逻辑的方法
- Enterprise Bean类
EJB构件开发
- 会话构件(Session Bean)
- Session bean 存在于客户应用与应用服务器交互的时间段内,是用来和客户端做交互的
- 和实体Bean 相比,Session bean 中的数据不保存在数据库中
- Session bean 又可分为两类
- 有状态的Session Bean 要跨方法调用保存会话状态,一个有状态的 Session Bean 实例同时只处理一个客户应用的请求,典型地如网上购物系统中提供购物车功能的Session Bean
- 无状态的Session Bean在方法调用中间不维护任何状态,一个无状态的Session bean 实例可以同时处理多个客户应用的请求,典型地如网上证券系统中提供股票信息查询功能的Session Bean
- 实体构件(Entity Bean)
- Entity Bean 代表数据库中的记录,在EJB 中是用来封装数据库操作的,与Session Bean相比,逻辑上可以认为Entity Bean 在数据库中的数据存在期间都会存在
- 同样与数据库中的数据类似,Entity Bean 可以被多个客户应用共享访问
- 消息驱动构件(Message Driven Bean)
- Message Driven Bean 主要用来处理异步消息,因此通常在异步编程模式下使用
- 会话构件与实体构件
- 客户端通过会话bean连接服务器,会话bean通过实体bean访问数据库,这使得既可以保存客户端的信息又可以保存数据库记录的信息
- 会话bean经常用于涉及多个实体bean的业务处理和控制逻辑
- Hello World Session Bean例子
- EJB构件访问流程
- EJB构件的实现步骤
- 创建Remote接口
- 创建Home接口
- 创建Bean的实现类
- 编译Remote接口、Home接口、bean实现类
- 创建部署描述符
- 将以上三个文件与部署描述符文件打包为一个 ejb-jar文件
- 部署EJB构件
接口设计原则
- Remote接口设计原则
- 继承性约束
- 每个Remote 接口必须继承EJBObject 接口
- 包含用于管理实现remote 接口的EJB 对象的方法
- 方法对应规则
- Remote 接口中出现的每一个方法的声明都必须在相应的Enterprise Bean类中有一个对应方法的实现
- 其中每个方法的参数和返回值必须完全相同,抛出的异常必须匹配
- 匹配的含义是指接口中方法抛出异常的集合必须包含 Bean 类中对应方法抛出异常的集合
- 即接口方法中出现的异常,Bean类中可以出现,也可以不出现,但是不允许Bean 类中方法抛出接口对应方法中没有声明的异常
- RMI 约束
- Remote 接口中的方法必须抛出RemoteException 异常,该异常报告网络通信错误
- 方法定义中的参数与返回值必须是合法的Java RMI 类型的参数/返回值
- 继承性约束
- Home接口设计原则
- 继承性约束
- 每个Home 接口必须继承EJBHome 接口
- 其中包含了Enterprise Bean 生命周期管理的方法
- 方法对应规则
- Home 接口中的每个create 方法都必须在相应的
Enterprise Bean 类中有一个对应的ejbCreate 方法 - 匹配同上
- Home 接口中的每个create 方法都必须在相应的
- RMI约束
- RemoteException同上
- Home 接口中的每个create 方法必须抛出 CreateException异常,该异常用于报告EJB 实例的初始化错误
- 继承性约束
Enterprise Bean 类设计原则
- 接口约束
- Enterprise bean 类必须实现EnterpriseBean接口
EnterpriseBean
接口中定义了Enterprise Bean 生命周期管理的方法,实现该接口是Enterprise Bean 与普通java bean 的重要区别
- 可见性约束
- Enterprise bean 类必须定义为public 类
- 商用方法约束
- Enterprise bean 类必须实现Remote 接口中定义的业务逻辑操作
- 生命周期管理方法约束
- Enterprise Bean 类必须实现Home 接口中定义的create 方法对应的 ejbCreate 方法
思考与练习!
- EJB 构件与普通的Java Bean 有哪些主要区别? 他们分别适合于什么场合的开发? 见前面
- EJB 体系结构中基于Stub/Skeleton 结构与客户端交互的直接构件不是EJB,而是容器自动生成的对象,采用这样的结构有什么好处? 不会
- 在 EJB 体系结构中,Home 接口与Remote 接口的主要作用是什么?为什么还要引入LocalHome 与Local 接口,这对接口使用时有哪些限制? 见前面
- EJB构件的访问流程?
- 查找Home对象的引用
- JNDI返回Home对象的引用
- 向Home接口请求一个EJB对象
- Home对象创建一个EJB对象
- Home对象返回给客户的EJB对象的引用
- 客户端通过Remote接口调用bean方法
- EJB对象请求Enterprise Bean调用bean实例的相应方法
- Enterprise Bean返回调用结果给EJB对象
- EJB对象把返回值返回给客户端
EJB构件开发
无状态会话Bean
- 无状态会话Bean每次调用只对客户提供业务逻辑, 但不保存客户端的任何数据状态
- 无状态会话Bean的状态,被保持在客户端,容器不负责管理
- 用途
- 如果数据实际上是瞬时映像,则建议使用无状态会话 Bean
- 如果数据状态非常敏感,则不要使用无状态会话 Bean,这些情况可以使用有状态会话Bean,将用户状态保存到服务器中
- 无状态会话Bean:生命周期由容器控制
- 当部署一个EJB时,容器会为这个Bean分配几个实例到组件池中
- 当客户请求一个Bean时,J2EE服务器将一个预先被实例化的Bean分配出去
- 空闲的Bean
- 不在方法或事务中
- 客户长时间不用
- 如果全部实例都已用完,则会自动生成一个新的实例放到池中,并分配给请求者
- 举例:返回服务端当前系统时间
- Remote接口(回忆设计原则)
- Home接口
- Home 接口中包含EJB 构件生命周期管理的相关方法,客户程序使用Home Interface 创建、查找或删除EJB 的实例
- 由于无状态会话构件的对象可能被多个客户端共享地访问 ,因此 EJB 规范不允许某个客户端使用特定的参数初始化无状态会话构件的对象,进而使得无状态会话构件Home 接口中只能包含没有参数的create 方法
- Enterprise Bean 类
- Enterprise Bean 类首先要按照Remote 接口的约定实现商业方法getCurTime,其次要实现 Home 接口中
create
方法对应的ejbCreate
方法与会话构件生命周期相关的方法
- Enterprise Bean 类首先要按照Remote 接口的约定实现商业方法getCurTime,其次要实现 Home 接口中
EJB生命周期管理
- 与普通的 Java 类相比,Enterprise Bean 类中多 出了
ejbCreate
、ejbRemove
、ejbPassivate
、ejbActivate
、setSessionContext
等EJB 生命周 期管理相关的方法 - 无状态会话构件的生命周期
- 方法就绪状态
- 方法就绪状态表明对应无状态会话构件对象已被创建,可以为客户端提供服务
- 不存在状态
- 不存在状态表明EJB 容器中不存在对应无状态会话构件的实例 ,处于不存在状态的实例还未被创建
- 无状态的会话构件实例的创建和删除都是由容器自动控制 ,容器也不允许客户端调用Home 接口中的
remove
方法来删除实例
- 方法就绪状态
思考
- EJB构件的实现步骤?
- 如果没有Home接口和Remote接口,开发人员需要做哪些工作?
有状态会话Bean
- 该EJB 构件实现网上购物系统中购物车的基本功能,包括添加商品、去除商品、查找商品、清空 购物车、提交商品等
- 由于该构件的实例(对象)需要保存与特定客户端相关的会话状态,即特定客户所选择的商品等相关信息,因此设计为有状态的会话构件。
- Remote接口
- Home接口
- Enterprise Bean 类
- 生命周期
- 方法就绪状态
- 不存在状态
- 实例未被创建
- 钝化状态
- 对应有状态会话构件对象已被转移至持久存储介质,暂时不能使用
- 因为有状态会话构件需保存与特定客户端相关的中间状态, 因此每个实例/对象都是被一个客户端所专用的。这就使得每个客户端都需要一个专门的有状态会话bean 来为它服务,则很有可能在服务端同时存在大量的EJB 实例,从而导致服务端内存开销太大。
- 为了限制服务端内存使用总量,当EJB 实例的数量过多时, 容器仅仅会在内存中保留那些正在使用或者刚被使用的实例 ,会把其它的实例转移到持久存储介质上(不是删除),此时被转移到持久存储介质上的实例会从方法就绪状态进入钝化状态。
- 当客户端出现超时时,容器会把持久存储介质中的实例删除掉,该实例进入不存在状态
- 只要有新的客户端请求,容器就会创建新的实例
实体构件与持久化技术 基于实体构件的支持,业务逻辑构件以对象的方式看待与处理数据库中的数据,从而大致简化数据库开发的目的。
常用的Java持久化方案
- 基于DAO和JDBC
- 这种方案通过DAO来实现数据的持久化操作,具体实现时,DAO通过JDBC来完成对数据库的访问。这种方案 要求开发人员对JDBC 的底层信息要比较熟悉。
- 基于ORM
- ORM的全称为Object Relational Mapping,其基本思想将关系型数据库中的数据利用某种机制映射为Java 对象,在业务逻辑构件看来,数据库中的数据以Java 对象的形式出现,通常每个对象对应数据库中的一条记录,因此数据库操作也就转换成了对Java 对象的操作。而这种数据与 Java 对象之间的映射通常可以获得自动化机制的支持,从而将开发人员从基于JDBC 的复杂开发中解脱出来
实体构件
- 最典型的情况是一个
EntityBean
和数据库中有一个表相对应,而EntityBean
的每一个实例对应表中的一行数据 - EntityBean和SessionBean的不同之处
- EntityBean是持久性的
- 应用程序结束或者服务器终止EntityBean的状态仍然保留
- 允许共享访问
- EntityBean可以被多客户端所共享
- 拥有主键并且会参与和其他EntityBean的关联
- EntityBean是持久性的
- 用途
- Bean代表一个商务实体而不是一个过程
- 例如表示信用卡的
CreditCardEJB
要做成EntityBean
, 而信用卡核实的VerifierEJB
就只能做成Session Bean
- 例如表示信用卡的
- Bean的状态是需要持久存储的
- 持久性管理机制
- BMP:Bean管理的持久性
- 相关数据库操作由开发人员在构件实现代码中通过JDBC 编程实现
- 须在EntityBean中手工编写访问数据库的代码
- CMP:容器管理的持久性
- 相关数据库操作由容器自动完成,容器会自动生成访问数据库的代码
- 开发者无需为数据库访问编码
- BMP:Bean管理的持久性
- Bean代表一个商务实体而不是一个过程
- 生命周期
- 就绪状态
- 实体构件实例建立了与EJB对象的关联,已经和数据库记录对应起来,可以处理客户应用的请求
- 不存在状态
- 池状态
- 实体构件的实例存在于实例池中,容器新创建的实例会进入这个状态
- 客户端程序调用Home接口中的方法创建或查找到某个实体构件实例时,该实例会从池状态进入就绪状态
- 就绪状态
- EBJ 1.1实体构件
- 封装数据库税率表中的数据操作
- Remote接口
- Home接口 Home 接口中的操作实际用于数据库表中记录的创建 (插入)、查找与删除
- Enterprise Bean 类
- EJB 2.0实体构件
- 区别
- Enterprise Bean 类的区别
- 在 EJB1.1 中,Enterprise Bean 类由开发人员定义
- 在EJB2.0 中,Enterprise Bean 类由容器生成,开发人员仅定义一个抽象基类
- Enterprise Bean 数据成员的区别
- 在EJB2.0 中与数据库字段对应的Bean属性不由用户定义, 用户仅定义对应的
set
和get
方法,具体属性的定义由容器生成,这样容器可以对属性进行优化 - 在EJB2.0 的CMP构件中,还有一种特殊的字段,cmr ( Container Managed Relationship)字段,用于关联其它的表(实体构件)。在组装/ 部署时,可以设置由容器自动维护表之间的关联关系
- 在EJB2.0 中与数据库字段对应的Bean属性不由用户定义, 用户仅定义对应的
- 接口区别
- EJB2.0 引入了本地接口,实体构件的进程内客户端可以通过本地接口获得更好的调用效率
- Enterprise Bean 类的区别
- 订单表与送货地址表结构 可以为地址EJB提供本地接口,订单EJB可通过地址 EJB 的本地接口获得较高的访问效率
- 地址EJB: Local接口
- 地址EJB: LocalHome接口
- 地址EJB: Enterprise Bean类的抽象基类
- 订单EJB:Remote 接口
- 订单EJB: Home 接口
- 订单EJB: Enterprise Bean类的抽象基类 …. 定义一个 CMR(Container Managed Relationship)字段对应的一对
set
与get
方法,CMR字段的类型为所关联的实体构件的Remote或 Local接口
- 区别
思考题
- 有状态会话构件与无状态会话构件有什么区别? 请分别从定义、生命周期、开发与部署的角度进行描述。
- 什么是有状态会话构件的生命周期的”钝化“状态?作用是什么?
- 实体构件包括哪两种持久性管理机制?
- EJB2.x 的实体构件与EJB1.x 的实体构件有哪些主要区别?
以下为实现可供客户端远程访问的网上购物系统中购物车功能的EJB构件的Home 接口与Remote 接口代码,请分别指出代码中违背设计原则之处 。(16分) Remote接口:
1
2
3
4
5
6
7
8
9
10package shopping;
import javax.ejb.*;
import java.rmi.*;
public interface ShoppingBag extends EJBLocalObject
{
public void addCom (Commodity comm) throws RemoteException;
public void removeComm (Commodity comm)
throws NoSuchCommodityException;
public void commit() throws BagEmptyException;
}Home接口:
答:1
2
3
4
5
6
7
8package shopping;
import javax.ejb.*;
import java.rmi.*;
public interface ShoppingBagHome extends EJBLocalHome
{
public ShoppingBag create(String customerName)
throws RemoteException;
}public interface ShoppingBag extends EJBLocalObject
违反继承性约束,应继承EJBObject
- 函数
removeComm
和commit
违反RMI约束,应抛出RemoteException
异常 public interface ShoppingBagHome extends EJBLocalHome
违反继承性约束,应继承EJBHome
4. 函数create
违反RMI约束,还应抛出CreateException
异常
RFID中间件
RFID系统构成
- 电子标签
- 读写器
- 系统高层
- 计算机网络
RFID中间件的必要性
- 数据采集点分散,读写器矩阵、标签打印或贴标等设备多样,众多底层硬件设备需统一管理
- 一个RFID系统可能服务于多个后台系统,需对RFID端口与后台系统的对应关系进行统一管理
- RFID系统的原始数据采集是分散的,需分布式处理的系统结构
- 后台应用系统的现有统一接口不能满足读写器设备及其数据采集场景的多样性需求
- 不断增加的RFID数据采集端口的海量数据 ,并不是后台应用系统所直接需要的,必须经过滤分类、统计分析处理之后,才能提交使用
- 随着应用的扩张需求,读写器数量和种类 会更新或增加,后端应用程序也会增加或改变,其数据结构或格式也会发生变化
RFID中间件概念 在RFID应用中,为RFID硬件和应用程序交互提供通用服务(具有标准的程序接口和协议),实现后台网络与RFID读写器无缝连接的一项重要技术。
RFID中间件功能
- 硬件管理
- RFID基础设施管理
- 连接RFID读写器,读取RFID标签数据
- 控制RFID读写设备按照预定的方式工作,保证不同读写设备之间能很好的配合协调
- 数据采集
- 数据处理
- 加工处理来自读写器的所有信息和事件流
- 对标签数据进行过滤、分组和计数,以减少发往信息网络系统的数据量
- 并防止错误识读、多读信息。按照一定的规则筛选过滤数据 ,去除阅读器产生的冗余、错误的标签数据。将真正有效的数据传送给后台的信息系统
- 生成报告时只上传关心的数据(分组统计)
- 数据传输
- 为分布式异构环境下的应用程序提供可靠数据通信服务,保证读写器和企业级分布式应用系统平台之间的可靠通信
EPC GLOBAL
- 组成
- 电子产品编码EPC
- Header (8bit) - Tag version number
- EPC Manager (28bit) - Manufacturer ID
- Object class (24bit) - Manufacturer’s product ID
- Serial Number (36bit) - Unit ID
- 识别系统(读写器和电子标签)
- 中间件
- 物联网名称解析服务 IOT-NS
- 将电子标签识别ID号转换成对应的统一资源标识符 (URI)
- 物联网信息发布服务 IOT-IS
- 对物联网中的信息进行处理和发布
- 网上存放物品信息的计算机称为物联网信息服务器
- 电子产品编码EPC
- 构成
- 技术规范
- 标签编码规范
- 射频标签逻辑通信接口规范
- Savant中间件规范
- ONS对象名称解析服务规范
- PML语言
Savant
- SAVANT是Auto-ID Center提出的分层、模块化的中间件组件,是具有数据捕获、监控、传送功能的数据挖掘工具
- 处理模块与外部世界的联系就通过2个规范中定义的接口实现
- Reader接口:提供与标签阅读器的联系
- 应用接口:提供与外部应用软件的联系
- RFID中间件和EPCIS捕获应用之间,定义了RFID事件过滤和采集接口(ALE)
- 基本操作
- 应用发一个请求到ALE的接口要求读或写标签,ALE Engine处理从读写器传回来的数据产生报告返回给应用
- 请求模式
- 基本操作