本人博客文章网址:https://www.peretang.com/basic-knowledge-of-message-driven-bean/
什么是消息
松散耦合的异步通信过程
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池额大小: 根据场景和需求配置
相关推荐
3. **消息驱动bean(Message-Driven Beans,MDB)**:专门用于处理JMS(Java Message Service)消息,它们在后台监听消息队列,并在接收到消息时执行相应的业务逻辑。 `javax.ejb`包包含了这些EJB组件的关键接口和...
在Java企业级应用开发中,EJB(Message Driven Bean, MDB)是用于处理异步消息传递的关键技术之一。而Java Naming and Directory Interface (JNDI)则是Java平台提供的一种标准接口,用于查找并获取应用程序所需的资源...
设置环境下载解开 glassfish 的拉链编辑 build.properties 文件指向 glassfish 所在的文件夹运行应用程序打开一个终端...glassfish 终端中,应显示消息: |MESSAGE BEAN: Message received: IS-Expert|参考 MDB的.html
3. **消息驱动Bean(Message Driven Beans,MDB)**:主要用于处理JMS(Java Message Service)消息,是异步处理的典型代表,可以解耦发送和接收消息的组件。 4. **实体Bean(Entity Beans)**:用于持久化数据,...
3. **JNDI查找**:MDB可能需要查找其他JNDI资源,如JMS连接工厂,以便建立与消息队列的连接。 4. **部署描述符**:虽然EJB 3.0倾向于使用注解,但仍然可能有一个ejb-jar.xml文件,包含额外的部署信息或兼容旧版本...
消息驱动Bean(Message-Driven Bean, MDB)是EJB的一个特殊类型,它充当了应用服务器和JMS(Java Message Service)之间的桥梁,用于处理异步通信。在本教程中,我们将深入探讨如何在JBOSS 4.0.4.GA环境下开发和部署...
在Java EE 5中,消息驱动Bean(MDB)是一种特殊的EJB组件,它主要用于处理异步消息。MDB能够接收并处理由Java消息服务(JMS)提供的消息,这使得Java EE应用能够实现基于消息的应用程序模型。 #### MDB概述 1. **...
总结一下,EJB消息驱动bean是Java EE应用中处理异步消息的核心组件,与JMS配合,可以实现高效、解耦的系统通信。"EJB消息驱动bean Demo"为你提供了一个实际操作的例子,通过它你可以学习如何设置和使用MDB,以及如何...
- **Message-Driven Bean(MDB)**:专门处理消息的EJB,主要用于异步处理。它监听消息队列(JMS,Java Message Service),在消息到达时自动触发业务处理。 2. **生命周期管理**: - 容器负责EJB的创建、初始化...
6. **测试与调试**:可以通过发送消息到MDB监听的队列或主题来测试其功能。可以使用JMS客户端工具,如JConsole或Admin Console,监控消息的流动和MDB的处理情况。 EJB 3.0引入的注解驱动开发极大地简化了MDB的创建...
MDBs通常与消息中间件一起工作,如ActiveMQ。ActiveMQ是Apache出品的一款开源消息代理,它实现了JMS(Java Message Service)规范,允许应用程序通过消息传递进行通信。在JBoss 4.0.5中集成ActiveMQ,可以创建一个...
MDB是EJB3中的消息驱动组件,主要用于处理JMS(Java Message Service)消息。它能够异步接收和处理消息,降低了系统的耦合度。通过`@MessageDriven`注解,可以定义MDB的接口,同时可以使用`@...
### EJB2与EJB3消息驱动Bean:深入解析与应用 #### 一、EJB2消息驱动Bean ##### 1. **理解消息驱动Bean(MDB)** 消息驱动Bean是Java EE中用于处理异步消息的一种特殊类型的EJB。在EJB2中,MDB主要用于接收来自消息...
虽然MDB负责处理消息,但是由运行MDB的EJB容器负责处理服务(事务、安全、资源、并发、消息确认,等等),使bean开发者把精力集中在处理消息的业务逻辑上。传统的JMS应用程序必须定制地编写一部分这些服务。MDB在...
7. **消息驱动bean(Message-Driven Beans, MDB)**:EJB 3.0中的MDB简化了处理JMS(Java Message Service)消息的过程,使得异步处理变得更加容易。 8. **可移植性**:由于EJB 3.0是Java EE标准的一部分,因此编写...
2. Message-driven Beans(MDB):消息驱动bean是响应JMS(Java Message Service)消息的bean,主要用于异步处理。 3. Entity Beans:实体bean映射到数据库中的持久化对象,分为传统的Entity Beans(CMP,Container-...
- 集成测试确保EJB与其他组件之间的交互。 #### 四、会话Bean (Session Bean) 1. **无状态Session Bean** - **仅Remote接口**:开发简单的无状态Session Bean,仅提供Remote接口。 - **仅Local接口**:创建只有...
消息驱动Bean(Message Driven Bean,MDB)是EJB的一种特殊类型,它专注于处理消息队列(Queue)或主题(Topic)中的消息,实现异步处理。在本例中,我们将探讨如何使用EJB消息驱动Bean处理Queue和Topic。 1. **...
2. **消息驱动Bean(MDB)的简化**:MDB用于处理异步消息,EJB 3.0简化了MDB的配置,引入了注解,使得MDB的定义更加直观易懂。 3. **增强的安全性和事务管理**:EJB 3.0提供了更强大的安全性和事务管理功能,包括细...
2. **mdb-annotation**:在Java 5及更高版本中,可以使用注解来声明和配置MDB,如 `@MessageDriven`,指定消息驱动类型、JMS目的地类型(队列或主题)以及JNDI查找名称等。 3. **ejb-jar.xml** 或 **META-INF/ejb-...