JMS解析(一)——JMS简介

12 篇文章 5 订阅
订阅专栏

消息中间件MQ及ActiveMQ介绍_踩踩踩从踩的博客-CSDN博客

前言

上篇文章对消息中间件做了个解析,以及ActiveMQ的安装和基本使用,做了个基本了解,因为如果不了JMS规范,一定是不学不好消息中间件和ActiveMQ,本篇文章会从JMS是什么,以及JMS如何使用API,消息如何发送,消息模型等等去解析JMS

概述

爪哇消息服务 (JMS) (oracle.com)

JMS即Java消息服务(Java Message Service)应用程序接口,是一个 Java平台中关于面向 消息中间件(MOM)的 API,用于在两个应用程序之间,或 分布式系统中发送消息,进行 异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

也就是java消息操作标准API。

为程序员制定的,少写代码,又可以操作消息中间件而提供的标准API规范, 对于应用来说只需要关心接口就行,而不管是那个消息中间件厂商实现。

对比的是jdbc连接数据库,我们只关心接口的api是什么,而不用关心具体是那个数据库去实现的;这也是简化程序员开发的场景。但有时候,为提高效率执行我们又不得不去关心,他是如何实现和执行的。那都是后话了

API

发展历史

出于历史原因,JMS为发送和接收提供了四组可选接口信息。

  • JMS 1.0定义了两个特定于域的API,一个用于点对点消息传递(队列)和一个用于发布/订阅(主题)。尽管由于向后的原因,这些仍然是JMS的一部分兼容性它们应该被认为是完全被后来的API所取代。
  • JMS 1.1引入了一个新的统一API,它提供了一组可以用于点对点和发布/订阅消息。这里称之为经典API
  • JMS 2.0引入了一个简化的API,它提供了经典API的所有特性,但需要更少的接口,使用更简单
  • 每个API都提供了一组不同的接口,用于连接JMS提供程序和发送数据和接收消息。但是,它们都共享一组用于表示消息和消息目的地,并提供各种实用程序功能。

所有接口都在javax.jms包中。

ActiveMQ 5 实现的就是 JMS1.1  规范 

经典api构成

经典API提供的主要接口如下:

  • ConnectionFactory—客户端用于创建连接的受管对象。这接口也被简化的API使用。
  • Connection-到JMS提供程序的活动连接
  • Session-用于发送和接收消息的单线程上下文
  • MessageProducer—由会话创建的对象,用于向服务器发送消息队列或主题
  • MessageConsumer—由用于接收消息的会话创建的对象发送到队列或主题

简化api构成

简化API提供与经典API相同的消息传递功能,但需要接口更少,使用更简单。简化API提供的主要接口如下:

  • ConnectionFactory—客户端用于创建连接的受管对象。这接口也被经典API使用。
  • JMSContext—到JMS提供程序的活动连接和的单线程上下文发送和接收消息
  • JMSProducer—由JMSContext创建的对象,用于将消息发送到队列或主题
  • JMSConsumer—由JMSContext创建的对象,用于接收发送的消息到队列或主题

在简化的API中,单个JMSContext对象包含经典API中的行为API由两个独立的对象提供,一个连接和一个会话。虽然本规范将JMSContext称为具有底层“连接”和“会话”,即简化的API不使用连接和会话接口。

在activemq代码中 都是jms 包下面的操作,包括连接 session等等。 

 在jar包中源码就能看出来,我们使用的时候全是接口

API在使用时,注意对多线程情况下的处理  包括目标  连接这些都是并发安全的。但会话等 都不是线程安全的。

在api使用过程  ,一定要start ,但并不是连接创建成功就必须要start,也可以 发送消息时,进行start都可以

 包括提供了停止服务,也可以在重复启动,停止;也包括了 close 关闭方法

jms支持的消息传递方式

JMS支持企业消息传递产品提供的两种主要消息传递样式:

  • 点对点(PTP)消息传递允许客户端通过中间抽象称为队列。发送消息的客户端将消息发送到特定队列。接收消息的客户端从该队列中提取消息。

  • 发布和订阅(pub/sub)消息允许客户端向多个服务器发送消息客户端通过称为主题的中间抽象。发送消息的客户端将其发布到特定主题。然后将消息传递给所有正在访问的客户端同意这个主题。

JMS消息模型

JMS Message Mode
消息由三部分构成, Header Body 必需, Properties 非必需
  • Header—所有消息都支持相同的标题字段集。标题字段包含值由客户端和提供者用于识别和路由消息。这里时不允许添加数据的
  • 属性-除了标准的头字段外,消息还为向消息中添加可选的标题字段。特定于应用程序的属性—实际上,这提供了一种添加应用程序特定的消息头字段。标准属性-JMS定义了一些实际上是可选的标准属性标题字段。特定于提供者的属性–某些JMS提供者可能需要使用特定于提供者的属性。JMS为这些文件定义了命名约定。  和头差不多
  • Body-JMS定义了几种类型的消息体,涵盖了大部分消息传递当前正在使用的样式。

在api中 可以看出实现的message

消息头的信息

包括那个实现,大部分都是 提供者也就是厂商实现的

头字段名
说明
Set By
Setter method
JMSDestination
消息的目的地, Topic 或者是 Queue
JMS
provider
send
method
setJMSDestination (not for
client use)
JMSDeliveryMode
消息的发送模式
JMS
provider
send
method
setJMSDeliveryMode(not
for client use)
JMSTimestamp
消息传递给 Broker 的时间戳,它不是实
际发送的时间
JMS
provider
send
method
setJMSDeliveryMode(not
for client use)
JMSExpiration
消息的有效期,在有效期内,消息消费者
才可以消费这个消息
JMS
provider
send
method
setJMSDeliveryMode(not
for client use)
JMSPriority
消息的优先级。 0-4 为正常的优先级, 5-9
为高优先级
JMS
provider
send
method
setJMSDeliveryMode(not
for client use)
JMSMessageID
一个字符串用来唯一标示一个消息
JMS
provider
send
method
setJMSDeliveryMode(not
for client use)
JMSReplyTo
有时消息生产者希望消费者回复一个消
息, JMSReplyTo 为一个 Destination ,表
示需要回复的目的地
Client
application
setJMSReplyTo
JMSCorrelationID
通常用来关联多个 Message
Client
application
setJMSCorrelationID,
setJMSCorrelationIDAsByte
JMSType
表示消息体的结构,和 JMS 提供者有关
Client
application
setJMSType
JMSRedelivered
如果这个值为 true ,表示消息是被重新发
送了
JMS
provider
prior to
delivery
setJMSRedelivered (not for
client use)
设置消息头
         

在发送消息之前,应用程序可以使用消息对象上的方法来设置JMSCorrelationID、JMSReplyTo和JMSType消息头。

 在代码设置模式

 Message properties

当我们需要执行自己添加的一些对消息内容添加标识等自定义的属性时,用到该字段

  • 属性名字

属性名称必须遵守消息选择器标识符的规则。见第3.8节“信息“选择”以获取更多信息。

  • 属性值

属性值可以是布尔值、字节值、短值、int值、长值、浮点值、双精度值和字符串。

设置属性:

在发送消息之前,客户端应用程序可以使用消息对象上的方法来设置消息属性

 消息体

消息发送 

 消息发送 中涉及到 同步发送、异步发送、发送有过期时间消息、发送延时消息、发送更优先的消息、设置消息的传递格式、消息顺序等

同步发送

在经典API中,MessageProducer上的以下方法可用于发送消息

同步地:

  • 发送(消息)
  • 发送(消息消息、整数传递模式、整数优先级、长时间生存)
  • 发送(目的地、消息消息、int-deliveryMode、int-priority、long)
  • 时间(寿命)
  • 发送(目的地、消息)

这些方法将一直阻止,直到消息被发送。如有必要,呼叫将被阻止,直到

已从JMS服务器接收回确认消息。

异步发送

在经典API中,MessageProducer上的以下方法可用于发送消息异步

  • 发送(消息消息,CompletionListener CompletionListener)
  • 发送(消息消息、int-deliveryMode、int-priority、long-timeToLive、CompletionListener)completionListener)
  • 发送(目标、消息消息、CompletionListener CompletionListener)
  • 发送(目的地、消息消息、int-deliveryMode、int-priority、long)timeToLive,CompletionListener(CompletionListener)

使用例子 主要是通过转换一次才能得到数据。

// 5、用目的地创建消息生产者
				MessageProducer producer = session.createProducer(destination);
				// 设置递送模式(持久化 / 不持久化)
				producer.setDeliveryMode(DeliveryMode.PERSISTENT);

				// 6、创建一条文本消息
				String text = "Hello world! From: " + Thread.currentThread().getName() + " : "
						+ System.currentTimeMillis();
				TextMessage message = session.createTextMessage(text);

				// 7、通过producer 发送消息
				System.out.println("Sent message: " + text);

				// 异步方式发送某条消息
				((ActiveMQMessageProducer) producer).send(message, new AsyncCallback() {

					@Override
					public void onException(JMSException exception) {
						// TODO Auto-generated method stub

					}

					@Override
					public void onSuccess() {
						try {
							System.out.println(Thread.currentThread().getName() + " 异步发送完成:messageId: "
									+ message.getJMSMessageID() + " " + text);
						} catch (JMSException e) {
						}
					}
				});

 以及在连接级别也可以设置异步的方式 以及session方式都可以设置改变属性就行

 对应添加callback 

异步时消息的顺序

消息顺序如果使用同一个生产者发送多条消息,则为JMS消息必须满足订购要求。即使已执行同步和异步发送的组合。应用程序是在发送下一条消息之前,无需等待异步发送完成。

ActiveMQ异步发送支持

 

在异步发送中 不要去调用close 关闭方法

CompletionListener回调方法不能对其自己的生产者会话调用close
(包括JMSContext)或连接,或在其自己的会话上调用提交或回滚。这样做将
导致关闭、提交或回滚抛出非法状态异常或IllegalStateRuntimeException(取决于方法签名)。

发送有过期时间消息

客户端可以为其发送的每条消息指定生存时间值(以毫秒为单位)。这是用来确定通过添加生存时间值计算的消息过期时间在发送方法上指定到消息发送时(对于事务性发送,这是客户端发送消息的时间,而不是事务提交的时间)。

发送延时消息

客户端可以为其发送的每条消息指定以毫秒为单位的传递延迟值。这是用来确定通过添加传递延迟值计算的邮件传递时间在发送方法上指定到消息发送时(对于事务性发送,这是客户端发送消息的时间,而不是事务提交的时间)。

在源代码中 设置的过期时间

发送更优先的消息 和 设置消息的传递模式  

发送更优先的消息,直接设置  priority  即可

JMS支持两种消息传递模式。

  • 非_持久化模式是开销最低的交付模式,因为它没有要求将消息记录到稳定存储器中。JMS提供程序故障可能会导致
  • 非永久性消息将丢失。持久化模式指示JMS提供程序格外小心,以确保消息是安全的不会因JMS提供程序故障而在传输过程中丢失。

JMS提供程序最多只能传递一次非_持久消息。这意味着它可能会失败信息,但不能传递两次。

JMS提供程序必须交付一次且仅一次持久性消息。这意味着一个JMS提供者失败不能导致它丢失,也不能两次交付它。

持久(一次且仅一次)和非持久(最多一次)消息传递是一种JMS客户机在交付技术之间进行选择的方法,如果JMS失败,可能会丢失消息提供者死了,而这些提供者需要付出额外的努力来确保消息能够在这种情况下生存失败此选择通常意味着性能/可靠性权衡。当一个客户选择非_持久传递模式,这表示它重视性能而不是性能可靠性选择持久性将反转所请求的权衡。

消息顺序

  • 了解消息顺序。默认是时间先后顺序。
  • 优先级较高的消息可能会跳到先前优先级较低的消息之前。传递时间较晚的邮件可以在传递时间较早的邮件之后传递时间
  • 由于JMS提供程序失败,客户端可能无法接收非_持久消息。如果将持久消息和非持久消息都发送到目标,则顺序仅为保证在交付模式内。也就是说,稍后可能会出现一条非持久消息在较早的持久消息之前;然而,它永远不会提前到达具有相同优先级的非持久消息。
  • 客户端可以使用事务处理会话将其发送的消息分组为原子单元(以下简称JMS事务的生产者组件)。事务对特定事务的消息顺序目的地意义重大。跨目的地发送消息的顺序并不重要。
深入浅出JMS(一)——JMS简介
人生是自己设计的一次快乐旅行
12-02 9万+
      如果手机只能进行实时通话,没有留言和短信功能会怎么样?一个电话打过来,正好没有来得及接上,那么这个电话要传递的信息肯定就收不到了。为什么不能先将信息存下来,当用户需要查看信息的时候再去获得信息呢?伴随着这个疑惑,短息和留言应运而生,无论手机是否开机、是否未及时接到,我们都能得到其中的信息。JMS提供了类似这样的功能,本章我们将系统的学习JMS中的相关重要内容。       Ø 掌握JMS基本概念及适用范围       Ø 点对点模型与发布/订阅模型的区别和使用场合       Ø
JMS消息服务器——Message消息分析(2)
caidaoqq的专栏
05-24 9552
3 消息类型JAVA消息服务定义了6种JMS提供者必须支持的Message接口类型。尽管JMS定义了Message接口,但它并未定义它们的实现方式。这就允许提供者以它们自己的方式实现和传送消息,同时为JMS应用程序开发者维护了一个兼容的标准接口。这6个消息接口是Message和它的5个子接口:TextMessage、StreamMessage、MapMessage、ObjectMessage和By
jms深入详解(说明介绍及源码)
03-08
深入探索jms,包含JMS深入探究十篇.doc、amq Maven工程、apache-activemq-5.8.0 JMS Provider。从浅到深讲解了JMS接口的用法,并以activemq为实例进行实现。
Java消息服务(JMS)第二版:概念、实践与源码分析
最新发布
weixin_35238815的博客
09-12 756
本文还有配套的精品资源,点击获取 简介:Java消息服务(JMS)是一种Java平台企业级应用集成的API标准,允许异步可靠的消息传递。它涉及消息生产者、消费者、代理等核心概念,并定义了点对点和发布/订阅两种消息模型。JMS提供不同类型的消息以适应不同数据格式,并支持事务和持久性,确保数据安全。书中源码演示了JMS API的使用和配置,旨在帮助读者深入理解JMS的应用,并通...
深入掌握JMS
topinking的专栏
09-17 276
1. JMS基本概念     JMS(Java Message Service) 即Java消息服务。它提供标准的产生、发送、接收消息的接口简化企业应用的开发。它支持两种消息通信模型:点到点(point-to-point)(P2P)模型和发布/订阅(Pub/Sub)模型。P2P 模型规定了一个消息只能有一个接收者;Pub/Sub 模型允许一个消息可以有多个接收者。    对于点到点模型,消息生产者...
JMS简介
qq_992833908
10-24 335
什么是JMS JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发。        JMS本身只定义了一系列的接口规范,是一种与厂商无关的 API,用来访问消息收发系统。它类似于 JDBC(java Database Connectivi...
JMSJMS详解
lmb55的专栏
04-26 1750
一、JMS介绍       JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或者在分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。  
ActiveMQ深度解析JMS框架实战教程
ActiveMQ是Apache软件基金会开发的一个开源JMS消息代理,它实现了JMS规范,用于在分布式系统中进行可靠的消息通信。 在ActiveMQ in Action这本书中,作者详细讲解了JMS的基础知识,首先介绍了JMS的基本构件: 1. *...
Spring框架深度解析——官方指南
9. **Messaging**:Spring的Messaging模块支持消息传递,例如JMS(Java Message Service),提供了生产者、消费者模式的抽象,使得消息通信更加简单。 10. **其他模块**:Spring还包含了其他模块,如Web MVC(模型-...
ActiveMQ——7.Spring-jms的配置
东天里的冬天
12-11 1090
概述 如何使用spring-jms来简化jms客户端的开发? 这篇文章主要记录如何配置以便以后复用。 producer端 producer端负责发送,这里使用JmsTemplate。 spring配置 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:x
JMS
05-24
NULL 博文链接:https://bozhi521.iteye.com/blog/363812
深入浅出JMS(一)--JMS基本概念
dawuafang
06-30 975
摘要: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...
JMS详解
aaaaaaaa0705的专栏
08-28 1003
什么是JMS   它是Java 消息服务     Java 消息服务是 J2EE (Java 2 Enterprise Edition) 套件的一部分,它提供了标准 API,Java 开发人员可以使用这些 API 来访问企业消息系统的共同特性。JMS 支持发布/
jms详解
bbw618的专栏
08-06 1049
<br />Java Message Service 规范 1.1 声称: <br /> JMS 是一组接口和相关语义,它定义了 JMS 客户如何访问企业消息产品的功能。 <br /> 在 JMS 之前,每一家 MOM 厂商都用专有 API 为应用程序提供对其产品的访问,通常可用于许多种语言,其中包括 Java 语言。JMS 通过 MOM 产品为 Java 程序提供了一个发送和接收消息的标准的、便利的方法。用 JMS 编写的程序可以在任何实现 JMS 标准的 MOM 上运行。 <br
143
原创
389
点赞
691
收藏
217
粉丝
关注
私信
写文章

热门文章

  • JMS解析(一)——JMS简介 19165
  • 加密算法之对称加密(AES加密) 及在jdk中应用 10648
  • RabbitMQ安装及客户端使用 8886
  • SpringBoot 核心源码解读 8189
  • Https网络安全传输详解 7539

分类专栏

  • java高并发多线程 16篇
  • 数据库及海量数据存储 17篇
  • 高并发负载均衡 10篇
  • 编程设计 1篇
  • 读书笔记 2篇
  • spring mybatis等框架源码深入理解 25篇
  • java代码开发工具 1篇
  • 高并发缓存 12篇
  • java高并发网络编程 11篇
  • 数据结构与算法 18篇
  • 高并发MQ 12篇
  • Java 集合框架原理分析 17篇
  • java 开发 demo 1篇
  • shell脚本调用 2篇

最新评论

  • 规则引擎详解

    CSDN-Ada助手: 推荐 Java 技能树:https://edu.csdn.net/skill/java?utm_source=AI_act_java

  • JMS解析(一)——JMS简介

    Ha_Ha_Wu: 机翻好难受

  • 加密算法之安全hash算法、RSA非对称加密算法分析

    火196: 大佬,私钥不能上锁,但可以签名,签名和加密有什么区别?

  • Netty IoT百万长连接优化

    江东子弟Pro: 扯吧,单机百万长链接就是笑话,nginx这么轻量的才几万就很了不起了。当单机达到10万,基本达到普通服务器硬件的网络处理极限了,你应用层怎么操作优化都没用的。作者这是没了解过吗,单纯的累加端口去尝试,思考的方向就不对。百万长链接的在游戏服务器最多,但那也是分区分服的,游戏服务器单机上限一两万的就了不起了。

  • Spring Boot 使用及启动源码解析一

    学习微站公众平台: 感谢分享,写的不错,也期待你的回访

最新文章

  • Solr介绍
  • 规则引擎详解
  • SpringMVC框架简介
2024年4篇
2023年7篇
2022年22篇
2021年110篇

目录

目录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踩踩踩从踩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家韶关玻璃钢红旗雕塑成都玻璃钢雕塑摆件多少钱许昌铜玻璃钢卡通雕塑公司楼盘玻璃钢雕塑造型贴金曲阳玻璃钢动物雕塑厂家推荐海宁玻璃钢雕塑报价玻璃钢雕塑厂家介绍泰州玻璃钢雕塑设计厂家服务好的玻璃钢海洋雕塑广安玻璃钢海豚雕塑价格盐田玻璃钢雕塑郑州玻璃钢雕塑雕刻江门品质玻璃钢卡通雕塑深圳主题商场美陈市场价深圳大型商场美陈制造玻璃钢大禹治水雕塑玻璃钢动物雕塑报价玉林玻璃钢泡沫雕塑厂家供应福建秋季商场美陈多少钱珠海遵义玻璃钢造型雕塑贵州玻璃钢雕塑设计公司正友玻璃钢花盆湖南仿铜玻璃钢雕塑大连玻璃钢雕塑制作施工园林玻璃钢卡通雕塑制作深圳开业商场美陈研发公司上海通道商场美陈售价鹤壁商场美陈玻璃钢雕塑加工流程固原玻璃钢景观雕塑栩栩如生香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化