阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

JMS(Java消息服务)入门教程

417次阅读
没有评论

共计 4755 个字符,预计需要花费 12 分钟才能阅读完成。

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

本文目录:

  1. 为什么需要 JMS
  2. JMS 的优势
  3. JMS 消息传送模型
  4. JMS 消息接收
  5. JMS 编程接口
  6. JMS 消息结构

为什么需要 JMS

在 JAVA 中,如果两个应用程序之间对各自都不了解,甚至这两个程序可能部署在不同的大洲上,那么它们之间如何发送消息呢?举个例子,一个应用程序 A 部署在印度,另一个应用程序部署在美国,然后每当 A 触发某件事后,B 想从 A 获取一些更新信息。当然,也有可能不止一个 B 对 A 的更新信息感兴趣,可能会有 N 个类似 B 的应用程序想从 A 中获取更新的信息。

在这种情况下,JAVA 提供了最佳的解决方案 -JMS,完美解决了上面讨论的问题。

JMS 同样适用于基于事件的应用程序,如聊天服务,它需要一种发布事件机制向所有与服务器连接的客户端发送消息。JMS 与 RMI 不同,发送消息的时候,接收者不需要在线。服务器发送了消息,然后就不管了;等到客户端上线的时候,能保证接收到服务器发送的消息。这是一个很强大的解决方案,能处理当今世界很多普遍问题。

JMS 的优势

异步

JMS 天生就是异步的,客户端获取消息的时候,不需要主动发送请求,消息会自动发送给可用的客户端。

可靠

JMS 保证消息只会递送一次。大家都遇到过重复创建消息问题,而 JMS 能帮你避免该问题。

JMS 消息传送模型

在 JMS API 出现之前,大部分产品使用“点对点”和“发布 / 订阅”中的任一方式来进行消息通讯。JMS 定义了这两种消息发送模型的规范,它们相互独立。任何 JMS 的提供者可以实现其中的一种或两种模型,这是它们自己的选择。JMS 规范提供了通用接口保证我们基于 JMS API 编写的程序适用于任何一种模型。

让我们更加详细的看下这两种消息传送模型:

点对点消息传送模型

在点对点消息传送模型中,应用程序由消息队列,发送者,接收者组成。每一个消息发送给一个特殊的消息队列,该队列保存了所有发送给它的消息 ( 除了被接收者消费掉的和过期的消息)。点对点消息模型有一些特性,如下:

  • 每个消息只有一个接收者;
  • 消息发送者和接收者并没有时间依赖性;
  • 当消息发送者发送消息的时候,无论接收者程序在不在运行,都能获取到消息;
  • 当接收者收到消息的时候,会发送确认收到通知(acknowledgement)。

JMS(Java 消息服务)入门教程

发布 /订阅 消息传递模型

在发布 / 订阅消息模型中,发布者发布一个消息,该消息通过 topic 传递给所有的客户端。在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅 topic。topic 主要用于保存和传递消息,且会一直保存消息直到消息被传递给客户端。

发布 / 订阅消息模型特性如下:

  • 一个消息可以传递给多个订阅者
  • 发布者和订阅者有时间依赖性,只有当客户端创建订阅后才能接受消息,且订阅者需一直保持活动状态以接收消息。
  • 为了缓和这样严格的时间相关性,JMS 允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。

JMS(Java 消息服务)入门教程

接收消息

在 JMS 中,消息的接收可以使用以下两种方式:

同步

使用同步方式接收消息的话,消息订阅者调用 receive()方法。在 receive()中,消息未到达或在到达指定时间之前,方法会阻塞,直到消息可用。

异步

使用异步方式接收消息的话,消息订阅者需注册一个消息监听者,类似于事件监听器,只要消息到达,JMS 服务提供者会通过调用监听器的 onMessage()递送消息。

JMS 编程接口

JMS 应用程序由如下基本模块组成:

  1. 管理对象(Administered objects)- 连接工厂(Connection Factories)和目的地(Destination)
  2. 连接对象(Connections)
  3. 会话(Sessions)
  4. 消息生产者(Message Producers)
  5. 消息消费者(Message Consumers)
  6. 消息监听者(Message Listeners)

JMS(Java 消息服务)入门教程

JMS 管理对象

管理对象(Administered objects)是预先配置的 JMS 对象,由系统管理员为使用 JMS 的客户端创建,主要有两个被管理的对象:

  • 连接工厂(ConnectionFactory)
  • 目的地(Destination)

这两个管理对象由 JMS 系统管理员通过使用 Application Server 管理控制台创建,存储在应用程序服务器的 JNDI 名字空间或 JNDI 注册表。

连接工厂(ConnectionFactory)

客户端使用一个连接工厂对象连接到 JMS 服务提供者,它创建了 JMS 服务提供者和客户端之间的连接。JMS 客户端(如发送者或接受者)会在 JNDI 名字空间中搜索并获取该连接。使用该连接,客户端能够与目的地通讯,往队列或话题发送 / 接收消息。让我们用一个例子来理解如何发送消息:

QueueConnectionFactory queueConnFactory = (QueueConnectionFactory) initialCtx.lookup ("primaryQCF");
Queue purchaseQueue = (Queue) initialCtx.lookup ("Purchase_Queue");
Queue returnQueue = (Queue) initialCtx.lookup ("Return_Queue");

目的地(Destination)

目的地指明消息被发送的目的地以及客户端接收消息的来源。JMS 使用两种目的地,队列和话题。如下代码指定了一个队列和话题。

创建一个队列 Session

QueueSession ses = con.createQueueSession (false, Session.AUTO_ACKNOWLEDGE);  //get the Queue object  
Queue t = (Queue) ctx.lookup ("myQueue");  //create QueueReceiver  
QueueReceiver receiver = ses.createReceiver(t);

创建一个话题 Session

TopicSession ses = con.createTopicSession (false, Session.AUTO_ACKNOWLEDGE); // get the Topic object  
Topic t = (Topic) ctx.lookup ("myTopic");  //create TopicSubscriber  
TopicSubscriber receiver = ses.createSubscriber(t);

JMS 连接

连接对象封装了与 JMS 提供者之间的虚拟连接,如果我们有一个 ConnectionFactory 对象,可以使用它来创建一个连接。

Connection connection = connectionFactory.createConnection();

创建完连接后,需要在程序使用结束后关闭它:

connection.close();

JMS 会话(Session)

Session 是一个单线程上下文,用于生产和消费消息,可以创建出消息生产者和消息消费者。

Session 对象实现了 Session 接口,在创建完连接后,我们可以使用它创建 Session。

Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

JMS 消息生产者

消息生产者由 Session 创建,用于往目的地发送消息。生产者实现 MessageProducer 接口,我们可以为目的地、队列或话题创建生产者;

MessageProducer producer = session.createProducer(dest);
MessageProducer producer = session.createProducer(queue);
MessageProducer producer = session.createProducer(topic);

创建完消息生产者后,可以使用 send 方法发送消息:

producer.send(message);

JMS 消息消费者

消息消费者由 Session 创建,用于接受目的地发送的消息。消费者实现 MessageConsumer 接口,,我们可以为目的地、队列或话题创建消费者;

MessageConsumer consumer = session.createConsumer(dest);
MessageConsumer consumer = session.createConsumer(queue);
MessageConsumer consumer = session.createConsumer(topic);

JMS 消息监听器

JMS 消息监听器是消息的默认事件处理者,他实现了 MessageListener 接口,该接口包含一个 onMessage 方法,在该方法中需要定义消息达到后的具体动作。通过调用 setMessageListener 方法我们给指定消费者定义了消息监听器

Listener myListener = new Listener();
consumer.setMessageListener(myListener);

JMS 消息结构

JMS 客户端使用 JMS 消息与系统通讯,JMS 消息虽然格式简单但是非常灵活,JMS 消息由三部分组成:

消息头

JMS 消息头预定义了若干字段用于客户端与 JMS 提供者之间识别和发送消息,预编译头如下:

– JMSDestination
– JMSDeliveryMode
– JMSMessageID
– JMSTimestamp
– JMSCorrelationID
– JMSReplyTo
– JMSRedelivered
– JMSType
– JMSExpiration
– JMSPriority

消息属性

我们可以给消息设置自定义属性,这些属性主要是提供给应用程序的。对于实现消息过滤功能,消息属性非常有用,JMS API 定义了一些标准属性,JMS 服务提供者可以选择性的提供部分标准属性。

消息体

在消息体中,JMS API 定义了五种类型的消息格式,让我们可以以不同的形式发送和接受消息,并提供了对已有消息格式的兼容。不同的消息类型如下:

Text message : javax.jms.TextMessage,表示一个文本对象。
Object message : javax.jms.ObjectMessage,表示一个 JAVA 对象。
Bytes message : javax.jms.BytesMessage,表示字节数据。
Stream message :javax.jms.StreamMessage,表示 java 原始值数据流。
Map message : javax.jms.MapMessage,表示键值对。

最后补充一下,常见的开源 JMS 服务的提供者,如下:

  • JBoss 社区所研发的 HornetQ
  • Joram
  • Coridan 的 MantaRay
  • The OpenJMS Group 的 OpenJMS

以上就是 JMS 的入门教程,在接下来的文章中,我将会编写一些 JMS 的例子。

学习愉快~

译文链接(做了部分修改,不是直接翻译的~~):http://howtodoinjava.com/jms/jms-java-message-service-tutorial/

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-06/132503.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4755字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7960582
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你

你的云服务器到底有多强?宝塔跑分告诉你 为什么要用宝塔跑分? 宝塔跑分其实就是对 CPU、内存、磁盘、IO 做...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

开源MoneyPrinterTurbo 利用AI大模型,一键生成高清短视频!

  开源 MoneyPrinterTurbo 利用 AI 大模型,一键生成高清短视频! 在短视频内容...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...