今天我们来一起学习EJB。EJB是一个用于分布式业务应用的标准服务端组件模型,EJB较Spring而言,它更适合于分布式的场合,实现最大程度的业务代码重用,EJB是一个重量级的开发框架。我们接下来就开始学习EJB······
1. EJB中有三种bean:①会话bean ②实体bean ③消息驱动bean
2. 会话bean分为无状态会话bean和有状态会话bean
3. 开发一个无状态会话bean需要完成接口(可以是远程接口或本地接口)和实现类的编写
4. Session bean客户端开发:
1) 设置JNDI访问环境信息:进行JNDI查找前,需要设置应用服务器的上下文信息,主要是设置JNDI驱动的类名(java.naming.factory.initial)和命名服务提供者的URL (java.naming.provider.url),不同的EJB容器,服务器的上下文信息不相同。可以在classpath下jndi.properties中配置JNDI的环境信息
2) 通过JNDI名称调用接口方法
5. 只有客户端与EJB应用在同一个JVM内运行的时候,我们才能调用本地接口,否则只能调用远程接口
6. Bean实例的管理技术:
1) 无状态bean使用实例池技术管理bean
2) 有状态bean使用激活管理bean
7. 会话bean之间相互调用可以采用依赖注入的方式实现
例:@EJB (beanName="HelloBean") LocalHello helloworld
8. 实体bean属于JPA里的技术,在实体bean应用中,需要在应用的类路径下的META-INF目录加入持久化配置文件persistence.xml(persistence.xml文件中可以配置Jboss的数据源以及持久化框架的属性)
9. JMS 支持两种消息传递模型:点对点和发布/订阅
1)点对点消息传递模型规定了一条消息只能传递给一个接收方, 采用javax.jms.Queue 表示
2)发布/订阅消息传递模型允许一条消息传递给多个接收方。采用javax.jms.Topic表示
10. 开始JMS编程前,需要先配置(XML)消息到达的目标地址(Destination),文件的取名格式应遵守*-service.xml
11. 使用JAVA类放送信息有以下步骤:
1)得到一个JNDI初始化上下文(Context)
InitialContext ctx = new InitialContext();
2)根据上下文查找一个连接工厂 QueueConnectionFactory 。该连接工厂是由JMS提供的,不需我们自己创建,每个厂商都为它绑定了一个全局JNDI,我们通过它的全局JNDI便可获取它;
QueueConnectionFactory factory = (QueueConnectionFactory) ctx.lookup("ConnectionFactory")
3) 从连接工厂得到一个连接 QueueConnection
conn = factory.createQueueConnection();
4) 通过连接来建立一个会话(Session);
session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
5) 查找目标地址:
Destination destination = (Destination ) ctx.lookup("queue/itcast ");
6) 根据会话以及目标地址来建立消息生产者MessageProducer
MessageProducer producer = session.createProducer(destination);
TextMessage msg = session.createTextMessage("您好,这是我的第一个消息驱动Bean");
producer.send(msg);
12.采用消息驱动bean接收信息:需要实现MessageListener接口,同时,需要使用注释指定MDB监听哪一个目标地址(Destination)
例:@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/foshanshop"),
@ActivationConfigProperty(propertyName="acknowledgeMode",
propertyValue="Auto-acknowledge")
})