EJB系列 - 消息与MDB


什么是消息

松散耦合的异步通信过程

1. 面向消息的中间件(MOM): 消息发送者称为生产者; 存储消息的位置称为目的地; 接受消息的组件称为消费者

2. 消息模型:

a. 点对点:目的地成为队列,消息只能被消费一次

b. 发布-订阅:目的地成为主体,消费者称为订阅者,消息能被任意数量消费

Java消息服务

1. JMS API:提供使用Java访问MOM(消息中间件)的统一标准方式

2. 开发消息生产者流程:

a. 使用依赖注入,获得连接工厂ConnectionFactory和目的地Destination对象

b. 使用连接工厂的createConnection打开连接Connection

c. 使用连接Connection的createSession创建会话Session并指定事务参数

d. 使用会话Session的createProducer创建货运队列Producer

e. 使用会话Session的createMessage创建消息Message并设置

f. 使用货运队列Producer的send发送消息

g. 释放资源

注意: 以上流程是基于JavaEE 6 的情况下, JavaEE 7 提供了更加简易的A开发流程

3. Message接口: 消息头, 消息属性, 消息体; 实现类: ObjectMessage传递对象, ByteMessage传递字节, MapMessage传递Map, StreamMessage传递流数据, TextMessage传递文字

消息驱动bean(MDB)

1. 优点:多线程,简化的消息代码

2. 设计原则:

a. MDB类必须直接或间接实现消息监听器接口

b. 必须是具体的公开的,不能是final和抽象类

c. 必须是POJO,不能是另一个MDB的子类

d. 必须有无参的构造器

e. 不能有final方法

f. 不能抛出任何运行时异常,因为当抛出是MDB实例将被终止

3. 使用MDB开发消费者流程

a. 使用注解@MessageDriven把类标记为MDB并且指定MDB配置

b. 实现MessageListener接口, 并实现onMessage方法

c. 在onMessage中实现逻辑

4. @MessageDriven: 注解被注解的类为MDB, 该注解有3个参数, name指定MDB的名称, messageListenerInterface指定MDB实现的消息接口(可以直接在类上implements接口), activationConfig用于指定专有的配置属性

5. MessageLisener: 把MDB注册为消息消费者, 可根据不同场景实现不同监听器接口

6. ActivationConfigProperty: 配置消息系统的配置信息

a. destinationType: 通知容器该MDB监听的是队列还是主题

b. connectionFactoryJndiName: 指定用于创建MDB的JMS连接的连接工厂JDNI

c. destianName: 指定正在监听的目的地

d. acknowledgeMode: 指定JMS会话确认模式

e. subscriptionDurability: 用于设置为持久订阅者

f. messageSelector: 过滤消息

7. MDB生命周期:

a. 创建MDB实例并设置它们

b. 注入资源

c. 存放到受管理的池中

d. 当检测到消息到达时监听的目的地时,从池中取出空闲bean

e. 执行消息监听器方法,即onMessage方法

f. 当onMessage方法执行完毕,把空闲bean存回池中

g. 根据需求从池中撤销/销毁bean

8. 从MDB发送消息: 从JNDI注入队列, 连接工厂对象, 然后和Java消息一样的操作

9. 管理事务: 正常情况下, 在onMessage方法前开启事务, 方法结束时提交事务. 可以通过消息上下文对象rollback事务

MDB最佳实践

1. 根据使用情况选择是否使用MDB

2. 选择消息模型: 应在程序设计时决定是PTP还是发布-订阅, 但幸运的是, 两者间切换仅仅需要修改配置即可

3. 保持模块化: MDB的onMessage方法不应该处理业务逻辑, 业务逻辑应该放在对应的会话bean, 并注入MDB, MDB负责调用对应的会话bean

4. 根据场景充分使用过滤器或划分目的地

5. 选择消息类型: 根据使用场景选择传输时使用的消息类型

6. 警惕有毒消息: 无法消费但又回滚了的消息会陷入无限循环的接收/回滚中, 虽然个别厂商有自己的处理死消息的实现, 但是在编程的时候要注意

7. 配置MDB池额大小: 根据场景和需求配置

参考

EJB 3 in Action, Second Edition

时间: 2024-10-05 19:44:21

EJB系列 - 消息与MDB的相关文章

会话EJB系列(四)SessionBean事务管理

(上一篇文章中我们介绍了<会话EJB系列(三)SessionBean生命周期>,本为的主要介绍SessionBean中事务管理) SessionBean从功能上可以分为两类: 第一类:成为EAO:用于封装底层的实体和JPA,本质上其功能就是DAO.(不需要事务控制.因为JPA本质是对ORM实现的封装.) 第二类:充当业务组件:是底层EAO对象的Facade,系统控制器(如struts中的Action,springMVC中的Controller)将调用他们的业务方法来处理用户请求.(需要添加事务

会话EJB系列(二)EJB分类

(本文承接上一篇文章<会话EJB系列(一)EJB概述>,继续对EJB内容展开详细解说) EJB规范中定义了三种Bean: 会话Bean(Session Bean) 实体Bean(Entity Bean) 消息驱动Bean(MessageDrive Bean) 一.SessionBean的概念和作用 (1)定义 作用:用于处理业务逻辑的完整组件. 当SessionBea部署在在EJB容器中后,客户端获取该EJB组件,并调用它的方法,至方法结束,称为:客户端与SessionBean之间的一次会话,

EJB3.0 EJB开发消息驱动bean

(7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个部分组成:             头(header),属性(property)和主体(body). 消息有下面几种类型,他们都是派生自 Message 接口.           StreamMessage:一种主体中包含 Java 基元值流的消息.其填充和读取均按顺序进行.          

会话EJB系列(五)拦截器

上一篇文章<会话EJB系列(四)SessionBean事务管理>中,我们介绍了SessionBean的事务管理机制. 本文主题'拦截器',详细介绍其用途.作用.与Spring框架AOP的对比,并介绍其初步用法. 一.简介 企业级应用中经常面对的事务管理.安全检查.缓存.对象池管理等,为此Spring框架提供了AOP方式,灵活控制业务方法!而EJB3没有提供AOP支持,那么他又是如何应对的呢? JavaEE规范中提供的横切性服务:事务管理和安全检查. EJB容器实现JavaEE规范 用CMT解决

会话EJB系列(三)SessionBean生命周期

(上一篇文章中我们介绍了<会话EJB系列(二)EJB分类> ,本文的核心为:SessionBean的生命周期) EJB生命周期:指EJB在运行过程中经历的阶段和状态. 首先强调的是:SessionBean的生命周期是由容器控制的而不是应用程序!对于客户端是完全透明的.但是对于开发者而言,必须了解SessionBean在EJB中的运行规律,才可以更好的管理SessionBean.当然允许被开发者改变. 在前面的文章中我们提到过,可以将EJB容器理解为Spring容器,运行在EJB中的Sessio

akka设计模式系列-消息模型(续)

在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然把akka中的消息分为命令和事件两大类,但二者的具体含义和实现有一点变化.“命令,是指一个actor给另外一个actor发送指令做相关的业务逻辑:事件,则是actor对某个命令的响应结果,或者对其他事件的响应结果”.之前是这样定义的,但在具体的实践过程中发现了一些问题. 比如,命令如何归类?是根据命

会话EJB系列(一)EJB概述

EJB(Enterprise Java Bean)是Java EE(以前叫J2EE)的核心规范,不仅仅是一种优秀的组件技术,而且还是Java EE 其它规范(如RMI,JNDI,JMS等)的具体应用. 一.EJB的概念和意义 (1)EJB规范的由来 随着软件规模的快速增大和技术复杂度(分布式软件的开发技术,如CORBA.RMI等)的增加,导致软件开发变得越来越复杂,使普通程序员难于处理各种系统级服务,从而使得大型软件系统的开发变得难以为继. 后来,Sun公司发布了EJB规范,目的是统一各种分布式

会话EJB系列(六)依赖注入

在本文的开始之前,先给大家介绍一个概念"依赖". 什么是依赖呢? 简单的说,就是A组件需要调用B组件,B组件需要调用C组件,C组件需要调用D组件-..这种调用称为:依赖! 在最早的应用程序中,依赖关系时通过new关键字来实现的.A组件依赖B组件,就是在A组件中显示的new一个B组件.缺点: 1.硬编码,耦合性强,难以维护.A组件只需要B组件中的方法,不必关心B组件的创建问题! 2.频繁的创建对象,导致系统开销增大. 上面的这种缺点,直接催生了'工厂模式'. 在工厂模式中,A组件依赖B组

EJB系列 - 会话Bean基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用会话bean 因为EJB大部分服务都是专门提供给会话bean的 1. 并发和线程安全: 容器利用很多技术来自动确保开发者不必担心并发或线程安全的问题   2. 远程处理和Web服务的服务提供   3. 事务和安全管理   4. 拦截器 会话bean的规范 1. 至少具有一个业务接口(EJB3.1后可