ActiveMQ系列:详细讲讲JMS(Java Messaging Service)

简介: 一条持久性的消息:应该被传送“一次仅仅一次”,这就意味者如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。一条非持久的消息:最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。

ActiveMQ系列:详细讲讲JMS(Java Messaging Service)


初步认识了ActiveMQ以及结合JavaSE进行初尝试之后,有兴趣的可以移步:


初步认识了ActiveMQ:https://blog.csdn.net/qq_26975307/article/details/98875098


结合JavaSE进行初尝试:https://blog.csdn.net/qq_26975307/article/details/98968854


此篇来讲讲JMS


1、Java


1.1、Java是什么


看到这里,可能有人要吐槽了:我都学消息中间件了,还不知道Java是什么吗?

冷静,Just calm down,你什么也不翻,把Java的核心规范工业标准讲讲(手动滑稽)


JavaEE是一套使用Java进行企业级应用开发的大家一致遵循的13个核心规范工业标准。


JavaEE平台提供了一个基于组件的方法来加快设计、开发、装配及部署企业应用程序,其中包括:


1、JDBC(Java Database)数据库连接


2、JNDI(Java Naming and Directory Interfaces)Java的命名和目录接口


3、EJB(Enterprise JavaBean)


4、RMI(Remote Method Invoke)远程方法调用


5、Java lDL(Interface Description Language)/CORBA(Common Object Broker Architecture)接口定义语言/公用对象请求代理程序体系结构


6、JSP(Java Server Pages)


7、Servlet


8、XML(Extensible Markup Language)可扩展白标记语言


9、JMS(Java Message Service)Java 消息服务


10、JTA(Java Transaction APl)Java事务API


11、JTS(Java Transaction Service)Java事务服务


12、JavaMail


13、JAF(JavaBean Activation Framework


1.2、Java消息服务


Java消息服务指的是两个应用程序之间进行异步通信的API,它为标准消息协议和消息服务提供了一组通用接口,包括创建、发送、读取消息等,用于支持JAVA应用程序开发。在JavaEE中,当两个应用程序使用JMS进行通信时,它们之间并不是直接相连的,而是通过一个共同的消息收发服务组件关联起来以达到解耦/异步削峰的效果。


Java官网的描述:


The Java Message Service (JMS) API is a messaging standard that allows application components based on the Java Platform Enterprise Edition (Java EE) to create, send, receive, and read messages. It enables distributed communication that is loosely coupled, reliable, and asynchronous.


20190813095632518.png


2、谈谈消息中间件的优劣势?


面试可能遇到的,不必惊慌,可以参考下篇,写的很优秀

https://blog.csdn.net/Iperishing/article/details/86674084


3、JMS


3.1、JMS的组成结构和特点


1、JMS provider:实现JMs接口和规范的消息中间件,也就是我们的MQ服务器


2、JMS producer:消息生产者,创建和发送lMs消息的客户端应用


3、JMS consumer:消息消费者,接收和处理lMs消息的客户端应用


4、JMS message


     4.1、消息头

     4.2、消息属性

     4.3、消息体


3.2、JMS message之消息头


3.2.1、JMSDestination


摘自官网:


As mentioned above, JMS defines two types of destinations, topics and queues. Most JMS providers support both topics and queues, and an application can make use of both. Dynamo applications typically use topics, as they offer the most flexibility for expansion. However, a messaging application might use queues for certain purposes, such as load balancing.


The use of destinations provides much of the flexibility in JMS. If a new application needs to send messages to or receive messages from an existing application, it can publish or subscribe to the destinations used by that application. The new application does not need to be aware of the message producers and consumers in the original application, just the destinations. This means that message producers and consumers can be added to or removed from one application without affecting other applications, as long as the destinations remain the same.


Each destination is maintained by a single JMS provider, which typically maintains many destinations. The creation and management of destinations within a JMS provider is usually an administrative or configuration operation. If a message is sent to a destination, that destination’s JMS provider is responsible for receiving the message and passing it on to subscribers waiting for messages from that destination. Different providers might use different mechanisms to accomplish this. For example, Dynamo’s SQL JMS uses an SQL database to store and deliver messages, for applications that require the messaging system to be highly reliable. Other JMS providers might use file- or memory-based storage.


移步官网拜读:https://docs.oracle.com/cd/E23095_01/Platform.93/ATGProgGuide/html/s1102jmsdestinations01.html


3.2.2、JMSDeliveryMode(持久模式和非持久模式)


一条持久性的消息:应该被传送“一次仅仅一次”,这就意味者如果JMS提供者出现故障,该消息并不会丢失,它会在服务器恢复之后再次传递。


一条非持久的消息:最多会传送一次,这意味这服务器出现故障,该消息将永远丢失。


3.2.3、JMSExpiration


可以设置消息在一定时间后过期,默认是永不过期


消息过期时间,等于Destination的send 方法中的timeToLive值加上发送时刻的GMT时间值。


如果timeToLive值等于零,则JMSExpiration被设为零,表示该消息永不过期。


如果发送后,在消息过期时间之后消息还没有被发送到目的地,则该消息被清除。


3.2.4、JMSPriority


消息优先级,从0-9十个级别,0到4是普通消息,5到9是加急消息。


JMS 不要求 MQ 严格按照这十个优先级发送消息,但必须保证加急消息要先于普通消息到达。默认是4级。


3.2.5、JMSMessagelD


唯一识别每个消息的标识,由 MQ 产生。


3.3、JMS message之消息体


封装具体的消息数据


5种消息体格式:


   TextMessage — 普通字符串消息,包含一个string


   MapMesage — 一个Map类型的消息,key为string类型,而值为Java的基本类型


   BytesMessage — 二进制数组消息,包含一个byte]


   StreamMessage — Java数据流消息,用标准流操作来顺序的填充和读取。


   objectMesage — 对象消息,包含一个可序列化的Java对象


发送和接受的消息体类型必须一致对应


3.4、JMS message之消息属性


作用:


如果需要除消息头字段以外的值,那么可以使用消息属性

识别/去重/重点标注等操作非常有用的方法


是什么:


他们是以属性名和属性值对的形式制定的。可以将属性是为消息头得扩展,属性指定一些消息头没有包括的附加信息,比如可以在属性里指定消息选择器。


消息的属性就像可以分配给一条消息的附加消息头一样。它们允许开发者添加有关消息的不透明附加信息。它们还用于暴露消息选择器在消息过滤时使用的数据。


TextMessage message=session.create TextMessage();
message.setText(text);
message.setStringProperty("username","z3"); //自定义属性


未完待续......(下篇讲讲JMS的可靠性)

相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
4月前
|
Java 应用服务中间件 Windows
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
【应用服务 App Service】App Service 中部署Java项目,查看Tomcat配置及上传自定义版本
|
2月前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
35 5
|
2月前
|
Java 数据库
基于java的汽车服务管理系统(Car Service Management System)
基于java的汽车服务管理系统(Car Service Management System)
29 0
|
4月前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
4月前
|
安全 Java 应用服务中间件
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
【Azure 应用服务】App Service中,为Java应用配置自定义错误页面,禁用DELETE, PUT方法
|
4月前
|
存储 Java 开发工具
【Azure 存储服务】Java Azure Storage SDK V12使用Endpoint连接Blob Service遇见 The Azure Storage endpoint url is malformed
【Azure 存储服务】Java Azure Storage SDK V12使用Endpoint连接Blob Service遇见 The Azure Storage endpoint url is malformed
|
4月前
|
编解码 Java API
【Azure 媒体服务】记录使用Java调用Media Service API时候遇见的一些问题
【Azure 媒体服务】记录使用Java调用Media Service API时候遇见的一些问题
|
4月前
|
Java 开发工具 Spring
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
【Azure Spring Cloud】使用azure-spring-boot-starter-storage来上传文件报错: java.net.UnknownHostException: xxxxxxxx.blob.core.windows.net: Name or service not known
|
4月前
|
Java Spring
【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
|
4月前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?