Java消息服务(JMS):在异步通信世界的引领者

news2024/11/20 3:24:39

在这里插入图片描述

在这里插入图片描述

文章目录

    • 前言
    • 需求演进
      • 异步通信的需求增长
      • 面向消息的中间件兴起
      • 标准化的迫切需求
    • 与相似框架的对比
      • JMS vs AMQP(Advanced Message Queuing Protocol)
      • JMS vs MQTT(Message Queuing Telemetry Transport)
      • JMS vs Apache Kafka
    • 完整的代码示例
    • 总结

前言

Java 消息服务(Java Message Service,简称 JMS)是 Java 平台上专门为分布式应用提供异步通信的 API。它在 JavaEE(Java Platform, Enterprise Edition)规范中被广泛采用,成为构建可靠、松耦合分布式系统的重要组成部分。JMS的诞生源于对企业级应用中消息通信的迫切需求,以解决跨应用、跨平台的消息传递问题。

需求演进

异步通信的需求增长

随着企业级应用的复杂性增加,同步通信模式逐渐显得力不从心。应用程序之间的耦合性变得不可控,特别是在分布式系统中。这导致了对一种更松散、更灵活的通信方式的需求,于是,异步通信崭露头角。

面向消息的中间件兴起

为了满足异步通信的需求,面向消息的中间件(Message Oriented Middleware,简称MOM)应运而生。MOM 通过消息传递实现了应用程序之间的通信,使它们能够以一种松耦合、可靠且异步的方式进行交互。JMS 作为 Java 平台上的 MOM API,成为了 Java 企业级开发中不可或缺的一环。

标准化的迫切需求

随着异步通信的广泛应用,需要一个标准化的API来确保不同厂商的消息中间件能够兼容。这促使了JMS的制定,它提供了一个通用的、与厂商无关的接口,使得开发者能够编写与具体消息中间件无关的代码,实现更大程度的可移植性和互操作性。

与相似框架的对比

JMS vs AMQP(Advanced Message Queuing Protocol)

AMQP 是一个开放的消息协议,而不是像 JMS 一样是一个 API。JMS 在 Java 企业应用中更为流行,因为它提供了更高级别的抽象和更容易使用的 API。AMQP 则更加灵活,适用于更广泛的语言和场景。

JMS vs MQTT(Message Queuing Telemetry Transport)

MQTT 是一个轻量级的消息协议,通常用于物联网(IoT)领域。相较于 JMS,MQTT 更注重资源效率和低带宽消耗,适用于资源受限的设备和网络。

JMS vs Apache Kafka

Kafka 是一个分布式流处理平台,与 JMS 的主要区别在于目标应用领域。Kafka 更适合处理大量数据流,而 JMS 更适用于企业级应用中的消息通信。

完整的代码示例

下面通过一个简单的实例演示 JMS 的基本使用。假设我们有一个简单的订单系统,需要通过消息队列处理订单的支付信息。

import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;

public class OrderSystem {

    public static void main(String[] args) {
        try {
            // 连接到ActiveMQ消息代理
            ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
            Connection connection = factory.createConnection();
            connection.start();

            // 创建会话
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
            
            // 创建队列
            Queue orderQueue = session.createQueue("OrderQueue");
            
            // 创建生产者
            MessageProducer producer = session.createProducer(orderQueue);

            // 创建订单消息
            TextMessage orderMessage = session.createTextMessage("Order123: Payment Received");

            // 发送订单消息到队列
            producer.send(orderMessage);
            System.out.println("Order Payment Message sent successfully.");

            // 创建消费者
            MessageConsumer consumer = session.createConsumer(orderQueue);

            // 设置消息监听器
            consumer.setMessageListener(message -> {
                if (message instanceof TextMessage) {
                    try {
                        String orderInfo = ((TextMessage) message).getText();
                        System.out.println("Received Order: " + orderInfo);
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            });

            // 模拟订单支付
            // 此处可以加入真实的业务逻辑,例如调用支付接口

            // 关闭连接
            connection.close();

        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

在这个简单的示例中,我们使用了 Apache ActiveMQ 作为消息代理,通过 JMS 发送和接收订单支付信息。首先,我们创建了一个连接到 ActiveMQ 的 ConnectionFactory,然后创建了一个 Connection 和一个 Session。接着,我们创建了一个队列(Queue)用于存放订单消息。

在生产者端,我们创建了一个 MessageProducer,并发送了订单支付信息到队列中。在消费者端,我们创建了一个 MessageConsumer,并设置了一个消息监听器,用于监听队列中的订单消息。一旦有新的订单消息到达,监听器将会被触发,处理接收到的订单信息。

这只是一个简单的例子,实际中 JMS 可以应用于更广泛的场景,例如发布-订阅模式、持久化订阅等。

总结

Java 消息服务(JMS)作为 Java 企业级开发的基石之一,为分布式系统中的异步通信提供了强大的支持。通过定义标准化的 API,JMS 使得开发者能够以一种通用的方式处理消息,实现了更加松散、可靠和可移植的分布式系统。与其他消息框架相比,JMS 在 Java 生态系统中仍然是一项强大的工具,为企业级应用的开发提供了可靠的消息通信机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1491702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

毫秒生成的时间戳如何转化成东八区具体时间

假设现在有一个时间是1709101071419L 后端代码实现 Java代码(东八区时间) 在Java代码中,我们将时区从UTC调整为东八区(UTC8): import java.time.Instant; import java.time.ZoneId; import java.time.Z…

onnx runtime文档学习2-torch TF简单示例

网上充斥着ONNX Runtime的简单科普,却没有一个系统介绍ONNX Runtime的博客,因此本博客旨在基于官方文档进行翻译与进一步的解释。ONNX runtime的官方文档:https://onnxruntime.ai/docs/ 如果尚不熟悉ONNX格式,可以参照该博客专栏…

网工内推 | 国企运维,年薪最高30W,RHCE认证优先

01 上海华力微电子有限公司 招聘岗位:系统运维资深/主任工程师 职责描述: 1、负责IT基础设施(包括服务器、存储、中间件等系统基础技术平台)的设计建设和日常运维管理; 2、负责生产、开发和测试环境的技术支持&#x…

【AI视野·今日CV 计算机视觉论文速览 第301期】Mon, 4 Mar 2024

AI视野今日CS.CV 计算机视觉论文速览 Mon, 4 Mar 2024 Totally 74 papers 👉上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Point Could Mamba: Point Cloud Learning via State Space Model Authors Tao Zhang, Xiangtai Li, Haobo Yuan, Shunping …

NVMe管理命令为何不用SGL?-1

上周末在公众号后台收到粉丝留言,主要是关于SGL的交流:“SGL为啥不能用于nvme admin cmd”? 回答这个问题前,首先,我们先回顾下NVME PRP和SGL的基本原理以及应用场景。 在Host与Controller之间有数据交互时&#xff0…

Distilling Knowledge via Knowledge Review

摘要 知识蒸馏从教师网络转移到学生网络,目的是大大提高学生网络的性能。以往的方法主要是通过提出特征变换和同级特征之间的损失函数来提高有效性。对师生网络连接路径交叉层次的影响因素进行了不同程度的研究,揭示了其重要性。在知识蒸馏中首次提出了…

【Python 识别某滑块的距离】今天来换思维搞滑块,不用识别库,几行代码就能搞定,仅供学习

写作日期:2024.03.05 使用工具:Python 温馨提示:此方法仅对有完整图和缺口图的滑块有效,可精准识别出缺口要滑动的距离 文章全程已做去敏处理!!! 【需要做的可联系我】 AES处理(直接…

HI3519DV500 HI3519DRFCV500 HI3519DRBCV500 海思安防监控芯片 提供原厂开发包

一、总体介绍 Hi3519DV500是一颗面向视觉行业推出的超 高清智能 SoC。该芯片最高支持四路sensor输 入,支持最高4K30fps的ISP图像处理能力,支持 2F WDR、多级降噪、六轴防抖、全景拼接、多光 谱融合等多种传统图像增强和处理算法,支持通过AI…

记录前端面试的一些笔试题(持续更新......)

文章目录 js相关数组去重数组对象去重 实现数组unshift数组扁平化tree型数据扁平化list数据转tree型数据 对象深拷贝防抖/节流函数柯里化函数管道 随便记录一些,面试或者工作中都会用到,实现的方法很多,这里只是一小部分,有更好的…

网上搞钱的方法你知道几个?盘点3个普通人都可操作的赚钱项目

项目一,微头条 我们可以借助精彩的文章,分享知识、心得和见解,吸引更多的读者关注并获得更多的点赞与评论。关键字的巧妙运用将使你的文章更具吸引力和影响力,同时也会为你带来更多的关注度和阅读量。我们写微头条文章的时候&…

【Python】使用numpy进行神经网络激活函数算法描述

【Python】使用numpy进行神经网络激活函数算法描述 系统:macOS 10.14.5 IDE:PyCharm 2018.2.4 一、What 1.1 NumPy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供…

找不到msvcr100.dll怎么办,多种解决方法快速修复msvcr100.dll问题

当计算机系统中关键文件msvcr100.dll丢失时,可能会引发一系列运行问题和故障现象。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分,对于许多基于Windows的应用程序正常运行至关重要。由于msvcr100.dll是许多应用程序运行所必需的动态…

BUUCTF:[MRCTF2020]ezmisc

题目地址:https://buuoj.cn/challenges#[MRCTF2020]ezmisc 下载附件打开是一张照片: 放到kali中发现crc校验错误,修改照片宽高: 保存即可发现flag flag为: flag{1ts_vEryyyyyy_ez!}

学习Python类型和对象,看这篇文章足矣!

类型与对象 一点基础理论: 对象代表现实世界中像轿车、狗、自行车这些事物。对象具有数据和行为两个主要特征。 在面向对象编程中,我们把数据当作属性,把行为当作方法。即: 数据 → 属性 和 行为 → 方法 类型是创造单个对象实例的蓝本。…

CSS元素分类,知乎上已获万赞

什么是css块元素? 块级元素是独占一行显示的。它的兄弟元素必定不会与其在同一行中(除非脱离了文档流)。通俗点来说,就是块元素(block element)一般是其他元素的容器元素,能容纳其他块元素或内联元素。 css块元素的三…

基于SSM的学科竞赛管理系统。Javaee项目。ssm项目。

演示视频: 基于SSM的学科竞赛管理系统。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring SpringMvcMybatisVueLayuiElemen…

Java 反射详解:动态创建实例、调用方法和访问字段

“一般情况下,我们在使用某个类之前已经确定它到底是个什么类了,拿到手就直接可以使用 new 关键字来调用构造方法进行初始化,之后使用这个类的对象来进行操作。” Writer writer new Writer(); writer.setName("少年");像上面这个…

2024年软考-官方最新考试安排出来了,软考新调整,很重要,但也很惹人气愤

官方最新通知,关于2024年度计算机技术与软件专业技术资格(水平)考试工作计划 笔试改机考后,必然会迎来调整,但有点让人费解。 这次调整变动主要是每年考试的次数调整,很多改为了一年一考,具体…

Centos8 yum方式安装Redis

Centos8 yum方式安装多个Redis 是否安装GCC依赖 ggc -v #或者 rpm -q gcc安装GCC yum install -y gcc如果不是管理员 加 sudo sudo yum install -y gcc yum安装Redis yum install redis失败更新yum 再安装 #添加EPEL仓库 sudo yum install epel-release#更新yum源 sudo yum upd…

Newsmy储能电源与您相约九州汽车生态博览

2024年3月7日—10日,第24届 深圳国际智慧出行、汽车改装及汽车服务业态博览会(以下简称“九州汽车生态博览会”)将在深圳国际会展中心(宝安)举办,Newsmy纽曼集团将在3号馆32523展位,携全系产品与…