文章目录
【笔记于学习尚硅谷课程所作】
4、JMS规范
4.1 JMS概述
1.JavaEE概念
JavaEE是一套使用Java进行企业级应用开发的大家一致遵循的13个核心规范T业标准。JavaEE平台提供了一个基于组件的方法来加快设计、开发、装配及部署企业应用程序
- JDBC (Java Database)数据库连接
- JNDI (Java Naming and Diredtory Interfaces) Java 的命名和目录接口
- EJB ( Enterprise JavaBean)
- RMI (Remote Method Invoke)远程方法调用
- Java IDL(Interface Description Language)CORBA(Common Object Broker Architecture)接口定义语言/公用对象请求代理程序体系结构
- JSP (Java Server Pages)
- Servlet
- XML ( Extensible Markup Language)可扩展白标记语言
- JMS (Java Message Service) Java 消息服务
- JTA (Java Transaction API) Java 事务API
- JTS (Java Transaction Service) Java事务服务
- JavaMail
- JAF (JavaBean Activation Framework
2.JMS概念
Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。
3.JMS的四大元素
- JMSprovider:实现IMS接口和规范的消息中间件,也就是我们的MQ服务器
- JMS producer:消息生产者,创建和发送JMS消息的客户端应用
- JMS consumer:消息消费者,接收和处理JMs消息的客户端应用|
- JMS message:消息,由消息头、消息属性、消息体组成
4.2 JMS message重要属性介绍
1.消息头
- JMSDestination:消息发送的目的地,主要是指Queue和Topic
- JMSDeliveryMode:设置持久/非持久模式。
- 持久性的消息:应该被传送“一次仅仅一次”,这就意味者如果JMS提供者现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。
- 非持久的消息:最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。
- JMSExpiration :可以设置消息在一定时间后过期,默认是永不过期
- JMSPriority :消息优先级,从0-9十个级别,0到4是普通消息,5到9是加急消息。(JMS不要求MQ严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。默认是4级。)
- JMSMessagelD:唯一识别每个消息的标识由MQ产生。
2.消息体
消息体:封装具体的消息数据(发送和接受的消息体类型必须一一致对应)
5种消息体格式:
- TextMessage:普通字符串消息,包含一个string
- MapMessage:一个Map类型的消息,key为string类型,而值为Java的基本类型
- BytesMessage:二进制数组消息,包含一个byte[]
- StreamMessage:Java数据流消息,用标准流操作来顺序的填充和读取
- ObjectMessage:对象消息,包含一个可序列化的Java对象
3.消息属性
定义:他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,属性指定一些消息头没有包括的附加信息,比如可以在属性里指定消息选择器。(它们允许开发者添加有关消息的不透明附加信息。)
作用:
如果需要除消息头字段以外的值,那么可以使用消息属性
识别/去重/重点标注等操作非常有用的方法
它们还用于暴露消息选择器在消息过滤时使用的数据。
4.3JMS的可靠性
1.持久性(PERSISTENT)
(1)参数说明
//非持久化:当服务器宕机,消息不存在。
messageProducer.setDeliveryMode(DeliveryMode.NON_ PERSISTENT);
//持久化:当服务器宕机,消息依然存在。
messageProducer.setDeliveryMode(DeliveryMode.PERSISTENT);
(2)Queue(默认是持久的):这是队列的的默认传送模式,此模式保证这些消息只被传送工次和成功使用一次。对于这些消息,可靠性是优先考虑的因素。可靠性的另一个重要方面是确保持久性消息传送至目标后,消息服务在向消费者传送它们之前不会丢失这些消息。
(3)Topic(持久化的)
- 一定要先运行一次消费者,等于向MQ注册,类似我订阅了这个主题。
- 然后再运行生产者发送信息,此时,无论消费者是否在线,都会接收到,不在线的话,下次连接的时候, 会把没有收过的消息都接收下来。
2.事务
事务偏生产者,签收偏消费者
producer提交事务时
- false
- 只要执行send,就进入到队列中。
- 关闭事务,那第2个签收参数的设置需要有效
- true
- 先执行send再执行commit,消息才被真正的提交到队列中。
- 消息需要批量发送,需要缓冲区处理
3.签收(Acknowledge)
- 非事务状态时
- 自动签收(默认):Session.AUTO_ACKNOWLEDGE
- 手动签收:Session.CLIENT_ACKNOWLEDGE
- 客戶端调用acknowledge方法手动签收:message.acknowledge();
- 事务状态时:以事务的提交方式为标准,签收方式失效
事务与签收
- 在事务性会话中,当一个事务被成功提交则消息被自动签收。如果事务回滚,则消息会被再次传送。
- 非事务性会话中,消息何时被确认取决于创建会话时的应答模式(acknowledgementmode)
4.4 总结
1.点对点总结
点对点模型是基于队列的,生产者发消息到队列,消费者从队列接收消息,队列的存在使得消息的异步传输成为可能。
1.如果在Session关闭时有部分消息已被收到但还没有被签收(acknowledged), 那当消费者下次连接到相同的队列时,这些消息还会被再次接收
2:队列可以长久地保存消息直到消费者收到消息。消费者不需要因为担心消息会丢失而时刻和队列保持激活的连接状态,充分体现了异步传输模式的优势
2.发布订阅总结
JMSPub/Sub模型定义了如何向一个内容节点发布和订阅消息,这些节点被称作topic
主题可以被认为是消息的传输中介,发布者(publisher)发布消息到主题,订阅者(subscribe)从主题订阅消息。
主题使得消息订阅者和消息发布者保持互相独立,不需要接触即可保证消息的传送。
1.非持久订阅
非持久订阅只有当客户端处于激活状态,也就是和MQ保持连接状态才能收到发送到某个主题的消息。
如果消费者处于离线状态,生产者发送的主题消息将会丢失作废,消费者永远不会收到。
2.持久订阅
客户端首先向MQ注册一个自己的身份ID识别号,当这个客户端处于离线时,生产者会为这个ID保存所有发送到主题的消息,当客户再次连接到MQ时会根据消费者的ID得到所有当自己处于离线时发送到主题的消息。
非持久订阅状态下,不能恢复或重新派送一个未签收的消息。
持久订阅才能恢复或重新派送一个未签收的消息。