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

在这里插入图片描述

在这里插入图片描述

文章目录

    • 前言
    • 需求演进
      • 异步通信的需求增长
      • 面向消息的中间件兴起
      • 标准化的迫切需求
    • 与相似框架的对比
      • 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.rhkb.cn/news/270371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx,php-fpm

一,Nginx是异步非阻塞多进程,io多路复用 1、master进程:管理进程 master进程主要用来管理worker进程,具体包括如下4个主要功能: (1)接收来自外界的信号。 (2)向各worker进…

腾讯云服务器99元一年购买入口链接

腾讯云服务器99元一年购买入口链接如下,现在已经降价到61元一年,官方活动链接如下: 腾讯云99元服务器一年购买页面腾讯云活动汇聚了腾讯云最新的促销打折、优惠折扣等信息,你在这里可以找到云服务器、域名、数据库、小程序等等多种…

OSPF NSSA实验简述

OSPF NSSA实验简述 1、OSPF NSSA区域配置 为解决末端区域维护过大LSDB带来的问题,通过配置stub 区域或totally stub区域可以解决,但是他们都不能引入外部路由场景。 No so stuby area (区域)NSSA 可以引入外部路由,支持…

LLM 系列——BERT——论文解读

一、概述 1、是什么 是单模态“小”语言模型,是一个“Bidirectional Encoder Representations fromTransformers”的缩写,是一个语言预训练模型,通过随机掩盖一些词,然后预测这些被遮盖的词来训练双向语言模型(编码器…

消息队列实现AB进程对话

进程A代码&#xff1a; #include <stdio.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/msg.h>#include <stdlib.h>#include <string.h>#define MSG_EXCEPT 020000struct msgbuf{long mtype;char mtext[100];};int main(in…

3/5 work

1> 使用select实现tcp的服务器端&#xff0c;poll实现tcp的客户端&#xff08;君子作业&#xff09; 2> 将课堂上实现的模型重新自己实现一遍 #include<myhead.h> #define SER_IP "192.168.124.23" #define SER_PORT 8888 int main(int a…

html 文字滚动

<marquee> 标签 创建文字滚动的标签 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>wzgd</title></head><body><marquee direction"left" height"30" width"600&q…

python并发编程:IO模型

一 IO模型 二 network IO 再说一下IO发生时涉及的对象和步骤。对于一个network IO \(这里我们以read举例\)&#xff0c;它会涉及到两个系统对象&#xff0c;一个是调用这个IO的process \(or thread\)&#xff0c;另一个就是系统内核\(kernel\)。当一个read操作发生时&#xff…

USB - Linux Kernel Menuconfig

Linux kernel&#xff0c;make menuconfig&#xff0c;和USB相关的&#xff0c;在主菜单选择Device Drivers。 Device Drivers下面&#xff0c;找到USB support。 在USB support下面&#xff0c;就可以对USB相关的item进行设置。 按照从上到下的顺序&#xff0c;打开的设置依次…

java-ssm-jsp-宠物护理预定系统

java-ssm-jsp-宠物护理预定系统 获取源码——》公主号&#xff1a;计算机专业毕设大全

全球最强AI易主!OpenAI不是唯一的人工智能公司

近日&#xff0c;AI大模型初创公司Anthropic发布了备受瞩目的Claude 3系列模型&#xff0c;这一系列模型在多个AI评估指标上领先于业界标准LLM&#xff0c;成为全球最强的人工智能模型。这一突破不仅给OpenAI带来了巨大的压力&#xff0c;同时也展示了Anthropic在人工智能领域的…

【C++STL详解 —— string类】

【CSTL详解 —— string类】 CSTL详解 —— sring类一、string的定义方式二、string的插入三、string的拼接四、string的删除五、string的查找六、string的比较七、string的替换八、string的交换九、string的大小和容量十、string中元素的访问十一、string中运算符的使用十二、…

解决DBeaver执行脚本报错No active connection

解决DBeaver执行脚本报错No active connection 1、报错问腿 2、问题解决 2.1、右键点击该数据库&#xff0c;选择SQL编辑器&#xff0c;选择新建SQL编辑器&#xff0c;然后将sql语句复制过去。 或者左击选中数据库后直接使用快捷键 Ctrl] 2.2、在Project-General中找到Scr…

Matlab梁单元有限元编程 | 铁木辛柯梁 | 欧拉梁 | Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

2024.3.6

作业1&#xff1a;使用C语言完成数据库的增删改 #include <myhead.h>//定义添加员工信息函数 int Add_worker(sqlite3 *ppDb) {//准备sql语句printf("请输入要添加的员工信息:\n");//从终端获取员工信息char rbuf[128]"";fgets(rbuf,sizeof(rbuf),s…

【C++】继续学习 string类 吧

开始使用 string类 吧 1 继续学习1.1 扩容机制1.2 string类对象的访问及遍历操作1.3 string类对象的修改操作1.4 其他一些成员函数 2 实践解决问题&#xff1a;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&…

【好书推荐-第九期】Sora核心技术相关书籍《扩散模型:从原理到实战》与《GPT 图解:大模型是怎样构建的》:Sora的两大核心技术,都藏在这两本书里!

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

C 嵌入式系统设计模式 20:队列模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述嵌入式并发和资源管理模式之六…

Stable Diffusion WebUI API http://127.0.0.1:7860/docs空白

在尝试调用Stable Diffusion WebUI API的时候&#xff0c;打开http://127.0.0.1:7860/docs遇到了以下页面 网络诊断是这样的原因&#xff1a; 修bug&#xff0c;改来改去遇到了以下两种页面&#xff1a; 此时http://127.0.0.1:7860可以如下正常显示&#xff1a; 查资料的时候找…

外包干了10天,技术退步明显。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;2019年我通过校招踏入了南京一家软件公司&#xff0c;开始了我的职业生涯。那时的我&#xff0c;满怀热血和憧憬&#xff0c;期待着在这个行业中闯出一片天地。然而&#xff0c;随着时间的推移&#xff0c;我发现自己逐渐陷入…