`

EJB系列 - 消息与MDB

阅读更多

本人博客文章网址: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池额大小: 根据场景和需求配置

 

0
0
分享到:
评论

相关推荐

    EJB-MDB:ejbs MDB 学习练习

    设置环境下载解开 glassfish 的拉链编辑 build.properties 文件指向 glassfish 所在的文件夹运行应用程序打开一个终端...glassfish 终端中,应显示消息: |MESSAGE BEAN: Message received: IS-Expert|参考 MDB的.html

    EJB MDB JNDI配置信息

    EJB MDB JNDI配置信息(包含Jboss,WebLogice..)

    MDB 消息驱动Bean

    虽然MDB负责处理消息,但是由运行MDB的EJB容器负责处理服务(事务、安全、资源、并发、消息确认,等等),使bean开发者把精力集中在处理消息的业务逻辑上。传统的JMS应用程序必须定制地编写一部分这些服务。MDB在...

    EJB3 PPT教程

    自己总结的EJB3上课教案,包括SessionBean、EntityBean、MDB、O/R映射与继承映射、持久化实体管理器、EJB3-QL、JTA等的教案.

    mdb.rar_EJB3.0_ejb3.0 example

    example mdb EJB3.0

    EJB详解 sessionbean entitybean MDB

    主要提供声明周期管理、代码产生、持续性管理、安全、事务管理、锁和并发行管理等服务

    JBOSS 4.0.5 EJB3.0之MDB (ACTIVEMQ)

    NULL 博文链接:https://seanwon.iteye.com/blog/721230

    EJB 3.0消息驱动Bean(p-to-p and Topic)

    许多初学者拜求的EJB知识点: @MessageDriven( activationConfig ={ @ActivationConfigProperty(propertyName="destinationType",propertyValue="javax.jms.Topic"), @ActivationConfigProperty(property...

    湘潭大学j2ee课程设计(基于webservice+ejb3.0+mdb+hibernate实现登录验证模块)

    这是我做的j2ee课程设计项目,基于web service,ejb3.0,mdb,hibernate的集成实现了登录验证模块。里面有详细的步骤说明,除了环境(myeclipse,jboss5.0,mysql)需要自己配置之外,其他的资源都有。 希望可以帮助到...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    第9章 消息驱动EJB 346 9.1 JMS和EJB 347 9.1.1 为什么使用MDB 347 9.1.2 使用MDB的设计原则 348 9.2 使用消息驱动Bean 349 9.2.1 使用@MessageDriven和@ActivationConfigProperty 350 9.2.2 实现MessageListener ...

    解析J2EE1.4新特性(4)-EJB2.1的新特性

    在支持Web服务的同时,EJB2.1也改进了EJB-QL以及消息驱动bean(MDB)的编程模型。该编程模型目前已经扩展至Java消息服务之上以支持任何一种消息系统。另外,新标准也推出了一种新的计时器服务,使得开发人员可以设计...

    WSAD环境下JMS异步通信全攻略

     为了支持异步通信,J2EE 1.3规范还引入了一种新的EJB类型:消息驱动的Bean,即Message Driven Bean,简称MDB。如前所述,在JMS之前,J2EE原来是一个建立在Java RMI-IIOP通信协议基础上的同步环境,但MDB却具有接收...

    EJB3.0 PPT

    详细介绍EJB中的实体Bean 及消息驱动Bean.具体内容有什么是实体/消息驱动Bean,各自特点,何时使用.生命周期,回调方法.及各自有简单示例.

    JBOSS使用指南

    1.3 消息驱动Bean(MDB): 2.会话Bean(Session Bean) 2.1因为客户端需要通过JNDI查找EJB,那么JNDI 是什么 2.2 Stateless Session Beans(无状态bean)开发 2.3 Stateless Session Bean与Stateful Session Bean的区三...

    weather-forecast-processor:使用 WebSockets 和 JMS 进行天气预报

    EJB 处理消息消费 (MDB) 并使整个流程具有周期性(任务调度)。 WebSockets 负责并发客户端实时更新——所有客户端同时获取更新。 技术栈 JDK 8 Apache Maven v.3.2 Java EE 7.0(WebSockets,JMS,EJB) ...

    企业分布式计算实验报告

    企业分布式计算的实验报告,主要是ejb中的消息驱动Bean(MDB)

    浅析WebLogic服务器上异步消息的接收

    消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件,文章在简单介绍WebLogic的基础上重点从4个方面讨论了消息驱动Bean。

    java 面试题 总结

    20、EJB与JAVA BEAN的区别? Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有...

Global site tag (gtag.js) - Google Analytics