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系列 - 消息与MDB的更多相关文章
- EJB3.0 EJB开发消息驱动bean
(7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个 ...
- akka设计模式系列-消息模型(续)
在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然 ...
- EJB系列 - EJB高级概念
本人博客文章网址:https://www.peretang.com/ejb-advanced-concepts/ EJB内幕 幕后的EJB:容器会为每一个bean实例自动生成称为EJB对象的代理, 由 ...
- EJB系列 - EJB基础知识
本人博客文章网址:https://www.peretang.com/basic-knowledge-of-ejb/ 什么是EJB 可移植的, 可重用的, 可伸缩的业务应用程序的平台 为什么选择EJB ...
- EJB系列 - 会话Bean基础知识
本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用 ...
- J2EE的十三个技术——EJB之消息驱动JMS
JMS--Java Message Service JAVA的消息服务,消息可实现两端通信. 用于访问面向消息中间件的标准api,他提供与厂商无关的访问方法,以访问消息收发服务. 特点:即使其中一方不 ...
- akka设计模式系列-消息模型
通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...
- 密码学系列——消息摘要(c#代码实操)
前言 简介: 消息摘要(Message Digest)又称为数字摘要(Digital Digest) 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 使 ...
- JMS分布式应用程序异步消息解决方案EhCache
高速缓存同步问题
部分博客中描述的使用拦截器怎么用EJB公布的WebService加入缓存,这样能够提高WebService的响应效率.但是即使是这样做,还是要经历网络的传输的.于是决定在调用WebService的程序 ...
随机推荐
- dp
1. 将原问题分解为子问题 2. 确定状态 3. 确定一些初始状态(边界状态)的值 4. 确定状态转移方程 1) 问题具有最优子结构性质.如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具 ...
- mysql获取当前日期的周一和周日的日期
,,date_format(curdate(),)//获取当前日期 在本周的周一 的日期 ,,date_format(curdate(),)//获取当前日期 在本周的周日 的日期
- [转]JAVA自动装箱和拆箱
http://www.cnblogs.com/dolphin0520/p/3780005.html 1.Java数据类型 装箱和拆箱之前,我们先来了解一下Java的基本数据类型. 在Java中,数据类 ...
- JVM调优总结:分代垃圾回收详述
为什么要分代 分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的.因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率. 在Java程序运行的过程中,会产生大量的对象, ...
- PHP面向对象之解释器模式
在博客园逛了1年多,从来都是看文章但没发表过什么文章.主要是因为技术太菜了,只有学习的份,自己那点水平实在也没什么好去分享的.但是最近在看 “深入PHP面向对象模式与实践” ,学习书中的内容后瞬间觉得 ...
- 基于HTML5快速搭建TP-LINK电信拓扑设备面板
今天我们以真实的TP-LINK设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动. 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink ...
- 配置nginx脚本开机自启动
vi /etc/init.d/nginx 插入以下内容,修改红色字体自己安装路径 #!/bin/bash## chkconfig: - 85 15# description: Nginx is a W ...
- 在 iOS 10.0 之后, App 要调用手机相机与相簿应注意的事项
iOS 的 SDK 每一年至少都会有一次大改版,从 2009 到 2016 年,版号已经到了第 10 版了,很轻易的就追上了 Mac OSX. 每一次的大改版都会有不少新的功能或新的规范,在 iOS ...
- Java 多线程详解(三)------线程的同步
Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html Java 多线程详解(二)------如何创建进程和线程: ...
- Python3.5 在Ubuntu16.04上无法画图的解决方案
1. 问题由来 在使用下面的测试代码学习python时,用Pycharm画不出来图像,SPYDER3 可以画出来. 下面的代码来自:http://old.sebug.net/ # -*- coding ...