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