EJB 实际上是用于编写业务层代码。
事务管理和安全管理
EJB为我们提供了很多企业开发中需要使用到的服务。如是事务管理、安全、持久化、分布式等。因为这些服务由容器提供。无需我们自行开发,这样大大减少开发成本。EJB设计初衷是有分布式管理的
EJB容器:推荐使用jboss weblogic
其中jboss中集成了tomcat+hibernate(JTA)
Java 分布式架构
J2EE 5 ---EJB 3.0
J2EE 6 ---EJB 3.1
J2EE 7 ---EJB 3.2
Web Container web 容器
EJB Container EBJ 容器
EJB的组成
会话bean(session bean) ---》相当于biz层
分为有状态的session bean 和无状态的session Bean
实体bean
jpa的编程方式 进行数据持久化的实体bean
消息驱动bean
作为JMS(java Message service java 消息服务)api的监听者,异步处理监听到的消息
EJB组成部分
Session Beans --->有状态sesion bean(stateful) 无状态session bean(stateless)
Message-Driven Beans --->容器管理实务(CMT) Bean管理实务(BMT)
Entity Beans --->容器管理的持久化(CMP) Bean 管理的持久化(BMP)
EJB 3.0新特性
1.元数据可通过annotation 注解方式开发
2.取消了home interfaces 在ejb3.0变成local interface
3.JNDI封装也采用annotation 方式
4.实体bean 进行了简化
5.对于checked exceptions检查异常进行简化
6.取消了callback interface 请求的的实现
EJB容器部署到app服务器中
EJB容器的职责:
先部署到app服务器再通过app提供的服务和客户端进行交互
对外提供的接口:持久化方面的接口(persistence)
EJB容器对所有EJB的生命期的管理
状态管理
安全机制
远程接口的调用
事务管理
Session Bean
客户端调用session bean --->通过实体bean 访问数据源
Client --- session bean ---X-Data store
如果不使用实体bean (entity bean) 用别的方式访问数据库也是可以的
实体bean 开发偏向复杂了 ---》开发实体bean 是hibernate的架构师
所以EJB3包括EJB2口碑不是特别好 就是由于实体bean
有状态的session bean 在有状态的属性部分存储信息
不需要数据库维护永久的状态信息
生命周期:
客户端第一次请求,sessionbean 里面是没有数据,通过相应接口创建session
准备好session bean ,给他进行相应的对话,并存放到对话中
过一段时间,如果再启用,客户端继续访问,访问的时候,先从对话里面看一下里面有没有
如果有的话给他进行激活session bean,就可以进行调用
如果调用的信息不需要要了,可以通过相应的移除接口,移除掉信息。
通过创建有状态的sessionbean -->添加相应属性到session 中---》使用的时候会话激活
隔了一段时间 如果session bean 有进行激活
当不需要session 时,移除掉ejb 就可以了
无状态的session bean
相当于在web 开发里的servlet,而servlet里面最好是不要存在状态信息的
基本上大部分的servlet 开发都是采用单例模式,里面也是没有转态信息的,从性能上来讲可以更好的满足用户的需求
生命周期:
请求如果没有无状态的session bean ,通过相应接口创建session bean
访问结束之后,把他移除掉就可以
大量的访问,如果一段时间没有访问,就通过容器把他移除掉
更详细的描述
客户端通过业务接口调用session bean 里面的信息,
这里面有一个session bean的实例池,池化的一个过程
通过bean实例池查看,这个session bean 是否存在,
不存在直接创建出来存放到bean 实例池中
存在直接进行调用
不需要 直接移除
有转态的session bean 和无状态的session bean 主要是对业务逻辑的封装
实体bean
Entity Bean
MVC 里面的entity object 还有一种是dao
这个实体bean 和数据库里的表里数据是实时对应的,而且这个机制是很复杂的
分类 BMP(Bean 管理的持久化Bean)和 CMP(容器管理的持久化bean)
jpa的编程机制,解释实体Bean 和数据库之间的交互
他的生命周期:中间是一个池化的过程和上面有所不同
Message-Driven Bean
消息驱动Bean
MDB--消息驱动bean 缩写
客户端发来请求消息--》请求消息放在消息队列里面
MDB-->通过队列一个个把相应消息取出来
再通过异步方式返回给客户是否成功
EJB本地视图和EJB 远程视图2个概念
事物容器管理事物 和bean管理事物
如果是jta(java transaction api)编程,使用userTransaction zh
这是一个bean的模式(BMT)
JNDI访问EJB
利用JNDI管理资源
JNDI 是一组处理多个命名和目录服务接口的api
jndi server--》EJB JMS 数据连接池
网络环境下,通过jndi管理资源
解决网络环境下的资源
jndi 通过名字进行查找网络资源
方法list() lookup() bind() unbind()
Context ctx = new InitialContext(env);
Object obj = ctx.lookup(name);
实例1:
fscontext.jar providreutil.jar引入对于的jar包
jndi读取目录资源
ctx.list();
实例2
读取文件信息
File file = (File)ctx.lookup(env);
BuffererReader bf = new BufferedReader(new File(file);
String line = null;
while((line=bf.readLine)!=null){
SYSO(line);
}
JNDI 类比资源数
JNDI树中的每一个节点,称为资源
JNDI会为每一个绑定到JNDI树中的资源分配一个别名。
只能通过别名取到JNDI树中的资源
JNDI 数据库访问
数据库驱动包放到tomcat lib下
eclipse--META-INF-->context.xml配置文件创建
JNDI配置
容器管理事物 bean管理事物 都是JTA事物的一部分,也就是分布式事物管理
作为JTA事物需要使用JNDI
开发步骤:
1.class12.jar 和oracle.jar-->放到jboss/server/lib
2.oracle-ds.xml 配置文件 --》放到jboss/server/default/deploy
3.格式的变化
普通模式:DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/BookStoreOracle");
ejb模式:DataSource ds = (DataSource)ctx.lookup("java:jdbc/BookStoreOracle");
4.CMT和BMT都是基于EJB服务器的,所以必须使用JNDI
获取Connection 方式一: Class.forName();
方式二:通过JNDI 方式获取connection
class BaseDao{
protected Connection conn;
protected static final String ORA_JNDI="java:jdbc/BookStoreOracle";
protected void OpenConnection(String strJNDIName) throws Exception{
if(conn == null || conn.isCLosed()){
InitialContext context = new InitialContext();
DataSource ds = (DataSource)ctx.lookup(strJNDIName);
conn = ds.getConnection(); //通过JNDI获取到数据库信息
}
}
}
本地事物
void beginTransaction(){
this.openConnection(); //获取连接
if(conn !=null){conn.setAutoCommit(false);} //打开事物
}
void commit(){ if(conn != null){conn.commit();}} //事物提交
void rollback(){ if(conn != null{conn.rollback();}}//事物回滚
try{
dao.beginTransaction();
...
dao.commit(); //如果出现错误进行回滚
}catch(Exception e){dao.rollback();} //这些都是手动控制事物的打开 事物的回滚 事物的提交
JTA的Bean 管理事物---》他是一种XA协议 不允许使用上面的Connection
现在的事物不允许使用Connection 方式获取事物的管理 打开 提交 回滚
采用另外一种形式UserTransaction
@TransactinManagement(TransactionManagerType.BEAN)
@Stateless
public class UserBiz implements UserLocal,UserRemote{
@Resource
UserTransaction uts; //Bean 事物管理,JTA事物管理的一种
void buyBooks(){
try{
uts.begin();
...
uts.commit();
}catch(Exception e){
uts.rollback();
}
}
}
容器管理事物CMT
和spring 管理事物很相像
spring管理事物是使用声明式事物通过注解的方式进行事物管理,
中间方法里面不需要手动开启事物 提交事物 回滚事物
@TransaxtionManagement(TransactionManagementType.CONTAINER)
@Stateless
class UserBiz implements UserLocal,UserRemote{
@Resource
SessionContex sctx;// 容器管理事物需要的类
@TransactionAttribute(TransactionAttributeType.REQUIRED)//这段注解可写可不写
void buyBooks()throws Exception{
try{... ...}
catch(Exception e){
sctx.setRollbackOnly();//通知容器,发生了异常,需要回滚
//设置了他容器就会回滚异常 ,如果不设置容器就不会回滚异常
}
}
//容器管理事物使用的是声明式事物管理,推荐使用容器管理事物
//可以管理多个资源的容器管理事物
}
spring框架和EJB框架对比
Spring框架:轻量级框架 ---》声明式事物
EJB框架:重量级框架 ---》事物处理
Spring --- SSH SSI整合 ---大量减少了重复性的代码
---编程复杂度大大减少了(针对EJB1 ~ 2)
Spirng 1.使用了事物配置文件 控制了在规定范围内的事物的控制
2.使用annotation方式进行事物的控制 注解的方式更加精确的控制那些方法受事物的处理,对性能提高的更好
@Transactional(rollbackFor=Throwable.class)
Spring3.0 和 Spring 4.0 于EJB3.0 对比
1.EJB的CMT和BMT代码更简单,开发更容易
2.引入Hibernate和iBatis后 ---JPA(Entity Bean)
Spring 与orm框架整合后,代码更简洁 ---比JPA编程容易
3.项目伸缩性和扩展性对比:
Spring框架是无法满足分布式事物(N-TIER),声明式事物只能完成本地事物
Spirng整合JTA事物需要引入第三方jar包并且不兼容会出现,这样不如使用EJB的CMT 容器管理事物 进行分布式事物控制
EJB框架在用户变化可能较大时,有明显的优势
总结:
中小型项目,用户的变化不会很大时,我们首选SSI(spring+ibatis)
重大型项目,应该首选EJB---CMT模式
======================================================
JMS及消息驱动Bean
RPC中间件技术的局限性
MOM系统 消息中间件系统
JMS(JAVA消息服务)
消息模型
消息驱动EJB
消息队列:
12306 春节订票
RPC中间件技术局限性
早期:CORBA,dcom,RMI等RPC中间件技术广泛应用于各个领域,但是面对规模和复杂度都越来越高的分布式系统,这些系统技术也显示出其局限性
1.同步通信:阻塞模式必须要有回应才能打开通信
2.客户和服务对象的生命周期紧密耦合
3.点对点通信:客户的一次调用只能发送给某个单独的目标对象
解决方案
面向消息中间件技术(MessageOrientedMiddleware,MOM)
较好的解决了以上的问题,发送者将消息发送给消息服务器,
消息服务器将消息存放在若干队列中,在合适的时候再将消息转发给接收着,这种模式下
1.发送者和接收者是异步的,发送者无需等待
2.二者的生命周期未必相同,发送消息的时候接收者不一定运行,接收消息时发送者也不一定运行
例如:qq消息
3.一对多通信:对于一个消息可以有多个接收者 例如:微信群内的消息
MOM系统 消息中间件系统
已有的MOM系统包括:
IBM的MQServies
Microsoft的MSMQ
BEA的MessageQ
由于没有一个通用的标准,这些系统很难实现互操作和无缝连接。java message Service(JMS)
是由SUN提出的旨在统一各种MOM系统接口的规范
包含点对点(point to point ,ptp) 和发布/订阅(Publish/Subscribt,pub/sub)
两种消息模型,提供可靠消息传输,事物和消息过滤等机制
JMS(JAVA 消息服务)
JMS只是接口,并没有给予实现,实现JMS接口的消息中间件称为JMS provide
消息的组成
分为三个部分 header properties body
消息头 属性 消息体
消息的类型:
ObjectMessage
MapMessage
StreamMessage
TextMessage---XMLMessage
ByteMessage
消息的同步和异步接收