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的可靠性)

相关实践学习
RocketMQ一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
30天前
|
Java
java实现遍历树形菜单方法——service层
java实现遍历树形菜单方法——service层
11 0
|
2月前
|
Java Unix 应用服务中间件
使用java service wrapper把windows flume做成服务
使用java service wrapper把windows flume做成服务
|
10天前
|
Java 测试技术
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
SpringBoot整合单元测试&&关于SpringBoot单元测试找不到Mapper和Service报java.lang.NullPointerException的错误
16 0
|
30天前
|
Java 计算机视觉
java实现人脸识别源码【含测试效果图】——Service层(IUserService)
java实现人脸识别源码【含测试效果图】——Service层(IUserService)
13 1
|
30天前
|
SQL 前端开发 Java
java为什么要分为service层,dao层,controller层和Entity层等?
java为什么要分为service层,dao层,controller层和Entity层等?
28 0
|
8月前
|
XML Java API
Java Web Service Get请求使用指南
Java Web Service Get请求使用指南 在当今互联网时代,Web Service已经成为了现代软件开发中不可或缺的一部分。而Java作为一种广泛使用的编程语言,自然也提供了丰富的工具和库来支持Web Service的开发。本文将为大家介绍如何使用Java编程语言进行Web Service的Get请求。
86 0
|
8月前
|
Java 调度 Spring
深入解析 Java 中的 @Service 注解:优化业务逻辑的组织与管理
在现代软件开发中,良好的代码组织和业务逻辑的模块化是保持代码可维护性和可扩展性的重要因素。而 Java 中的 `@Service` 注解则是实现业务逻辑组织和管理的有力工具。通过该注解,我们可以将业务逻辑标记为服务组件,实现依赖注入和松耦合的架构。本文将带您深入探索 Java 中的 `@Service` 注解,揭示其作用、用法以及在实际开发中的应用场景。
|
9月前
|
Java 数据库连接 API
【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService
【Java基础】Java SPI 一 之SPI(Service Provider Interface)进阶& AutoService
|
10月前
|
SQL 前端开发 JavaScript
JAVA框架的层级和各层理解 controller,service,dao,mapper,model等层和各包的作用
JAVA框架的层级和各层理解 controller,service,dao,mapper,model等层和各包的作用
418 0
|
11月前
|
Java
Java:Springboot的service循环依赖问题
Java:Springboot的service循环依赖问题
137 0