什么是消息

松散耦合的异步通信过程

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的更多相关文章

  1. EJB3.0 EJB开发消息驱动bean

    (7)EJB3.0 EJB开发消息驱动bean JMS 一: Java消息服务(Java Message Service) 二:jms中的消息 消息传递系统的中心就是消息.一条 Message 由三个 ...

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

    在之前的akka设计模式系列-消息模型中,我们介绍了akka的消息设计方案,但随着实践的深入,发现了一些问题,这里重新梳理一下设计方法,避免之前的错误.不当的观点给大家带来误解. 命令和事件 我们仍然 ...

  3. EJB系列 - EJB高级概念

    本人博客文章网址:https://www.peretang.com/ejb-advanced-concepts/ EJB内幕 幕后的EJB:容器会为每一个bean实例自动生成称为EJB对象的代理, 由 ...

  4. EJB系列 - EJB基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-ejb/ 什么是EJB 可移植的, 可重用的, 可伸缩的业务应用程序的平台 为什么选择EJB ...

  5. EJB系列 - 会话Bean基础知识

    本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用 ...

  6. J2EE的十三个技术——EJB之消息驱动JMS

    JMS--Java Message Service JAVA的消息服务,消息可实现两端通信. 用于访问面向消息中间件的标准api,他提供与厂商无关的访问方法,以访问消息收发服务. 特点:即使其中一方不 ...

  7. akka设计模式系列-消息模型

    通过前面的文章我们总结了几个常见的actor设计模式,但此处不得不提前介绍一下在Akka中消息的设计模式.随着对Akka的使用,我们会发现,使用Akka设计系统其实就是面向消息编程.actor之间消息 ...

  8. 密码学系列——消息摘要(c#代码实操)

    前言 简介: 消息摘要(Message Digest)又称为数字摘要(Digital Digest) 它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 使 ...

  9. JMS分布式应用程序异步消息解决方案EhCache 高速缓存同步问题

    部分博客中描述的使用拦截器怎么用EJB公布的WebService加入缓存,这样能够提高WebService的响应效率.但是即使是这样做,还是要经历网络的传输的.于是决定在调用WebService的程序 ...

随机推荐

  1. Mirantis MCP 1.0:OpenStack 和 Kubernetes 整合的第一步

    1.前言 Mirantis 公司在2014年9月14日宣布收购 TCPCloud,然后宣布在2017年第一季度会推出全新的私有云产品.从那时候开始,我就一直满怀期待.终于,今年4月19日,Mirant ...

  2. Java学习笔记——序列化和反序列化

    寒雨连江夜入吴,平明送客楚山孤. 洛阳亲友如相问,一片冰心在玉壶. --芙蓉楼送辛渐 持久化数据的第一种方式.在序列化之前也可以把数据打散逐行存储在文件中,然后在逐行读取. 比如定Student类 用 ...

  3. MySQL ProxySQL读写分离实践

    目的 在上一篇文章MySQL ProxySQL读写分离使用初探里初步介绍了ProxySQL的使用,本文继续介绍它的一些特点和DBProxy的性能差异.深入一些去了解ProxySQL,通过测试来说明Pr ...

  4. 如何选择版本控制系统之二---Git的研发应用场

    之前写了一篇<如何选择版本控制系统 ---为什么选择Git版本控制系统>,地址是:http://www.cnblogs.com/goldenfish/p/6876864.html,有兴趣的 ...

  5. 【css3网页布局】flex盒子模型

    1.0 前言 网页布局(layout)是CSS的一个重点应用. 经典布局类型: 布局的传统解决方案,基于盒状模型,依赖 display属性 + position属性 + float属性.它对于那些特殊 ...

  6. java 操作 redis

    1.Java 使用 Redis 只需要下载一个jar包即可 地址:http://maven.outofmemory.cn/redis.clients/jedis/2.5.2/ 工程

  7. 快速找到ARP病毒源

    第一招:使用Sniffer抓包 在网络内任意一台主机上运行抓包软件,捕获所有到达本机的数据包.如果发现有某个IP不断发送请求包,那么这台电脑一般就是病毒源.原理:无论何种ARP病毒变种,行为方式有两种 ...

  8. HTML中部分标签的嵌套问题

    书写HTML结构的时候,对于标签的嵌套问题,在我发现这个问题之前,都不在自己的考虑之中,还傻傻的以为标签之间是可以进行百搭的! 其实,有些标签是不能进行随意嵌套,如果你没有深受其害,你是不会发现它的存 ...

  9. springboot 集成shiro

    首先看下shiro configuration 的配置,重要部分用红色标出了 package cn.xiaojf.today.shiro.configuration; import at.pollux ...

  10. OpenCv关于灰度积分图的SSE代码学习和改进。

    最近一直沉迷于SSE方面的优化,实在找不到想学习的参考资料了,就拿个笔记本放在腿上翻翻OpenCv的源代码,无意中看到了OpenCv中关于积分图的代码,仔细研习了一番,觉得OpenCv对SSE的灵活运 ...