Java 消息队列详解

什么是消息队列?

消息队列是一种通过存储消息来实现系统间通信的中间件。消息生产者将消息发送到队列中,消息消费者从队列中取出并处理消息。这种模式实现了生产者和消费者的解耦,即使它们不同时在线,也可以通过消息队列进行通信。

消息队列的关键概念

  1. 消息(Message):传递的数据单元,可以是文本、JSON、XML等格式。
  2. 生产者(Producer):发送消息的应用程序或组件。
  3. 消费者(Consumer):接收并处理消息的应用程序或组件。
  4. 队列(Queue):存储消息的容器,遵循先进先出(FIFO)原则。

为什么使用消息队列?

消息队列在分布式系统中有许多优势:

  1. 解耦:生产者和消费者可以独立开发、部署和扩展,互不影响。
  2. 异步处理:生产者发送消息后立即返回,不必等待消费者处理完毕,提高系统响应速度。
  3. 削峰填谷通过消息队列可以平滑高峰期的流量,避免系统过载。
  4. 可靠性 消息队列可以保证消息的持久化和传递,即使系统故障也不会丢失消息。
  5. 扩展性:可以轻松地增加生产者或消费者来提高系统的处理能力。

常见的 Java 消息队列实现

  1. ActiveMQ
    Apache ActiveMQ 是一个开源的消息中间件,支持多种消息传递协议。它具有高性能、高可用性和高可扩展性的特点,广泛应用于企业级应用中。
import org.apache.activemq.ActiveMQConnectionFactory;import javax.jms.*;public class ActiveMQExample {public static void main(String[] args) throws JMSException {// 创建连接工厂ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");// 创建连接Connection connection = factory.createConnection();connection.start();// 创建会话Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);// 创建队列Queue queue = session.createQueue("exampleQueue");// 创建生产者MessageProducer producer = session.createProducer(queue);TextMessage message = session.createTextMessage("Hello, ActiveMQ!");producer.send(message);// 创建消费者MessageConsumer consumer = session.createConsumer(queue);TextMessage receivedMessage = (TextMessage) consumer.receive();System.out.println("Received message: " + receivedMessage.getText());// 关闭连接connection.close();}
}
  1. RabbitMQ
  2. RabbitMQ 是基于 AMQP 协议的消息中间件,以其易用性和灵活性著称,支持多种编程语言,包括 Java。
import com.rabbitmq.client.*;public class RabbitMQExample {private final static String QUEUE_NAME = "exampleQueue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello, RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println("Sent message: " + message);DeliverCallback deliverCallback = (consumerTag, delivery) -> {String receivedMessage = new String(delivery.getBody(), "UTF-8");System.out.println("Received message: " + receivedMessage);};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});}}
}
  1. Kafka
    Apache Kafka 是一种高吞吐量、分布式的消息系统,适用于实时数据流处理。
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.clients.consumer.*;import java.util.Collections;
import java.util.Properties;public class KafkaExample {public static void main(String[] args) {String topic = "exampleTopic";// 生产者配置Properties producerProps = new Properties();producerProps.put("bootstrap.servers", "localhost:9092");producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");Producer<String, String> producer = new KafkaProducer<>(producerProps);producer.send(new ProducerRecord<>(topic, "key", "Hello, Kafka!"));producer.close();// 消费者配置Properties consumerProps = new Properties();consumerProps.put("bootstrap.servers", "localhost:9092");consumerProps.put("group.id", "exampleGroup");consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");Consumer<String, String> consumer = new KafkaConsumer<>(consumerProps);consumer.subscribe(Collections.singletonList(topic));ConsumerRecords<String, String> records = consumer.poll(1000);for (ConsumerRecord<String, String> record : records) {System.out.printf("Received message: %s%n", record.value());}consumer.close();}
}

应用场景

**日志收集:**系统各组件将日志发送到消息队列,集中处理和分析。
**订单处理:**电商平台接收订单请求后,通过消息队列异步处理订单和库存系统。
**消息通知:**用户操作后,通过消息队列发送邮件或短信通知。
实时数据流:利用 Kafka 实现实时数据流处理,如点击流分析和实时监控。

总结
消息队列是现代分布式系统中的关键组件,能够显著提高系统的可靠性、扩展性和可维护性。Java 生态系统中有多种优秀的消息队列实现,如 ActiveMQ、RabbitMQ 和 Kafka,可以根据具体需求选择合适的工具。希望本文能够帮助你更好地理解 Java 消息队列及其应用场景。

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

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

相关文章

道可云元宇宙每日资讯|厦门:运用元宇宙技术助力直播电商发展

道可云元宇宙每日简报&#xff08;2024年6月20日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 厦门&#xff1a;运用元宇宙技术助力直播电商发展 近日&#xff0c;厦门市商务局印发《厦门市促进直播电商高质量发展若干措施&#xff08;2024年-2026年&#xff0…

T200S4高清4路SDI采集卡

产品简介&#xff1a; 同三维T200S4 4路高清SDI采集卡&#xff0c;可以同时采集4路SDI高清信号&#xff0c;卡上有4个SDI接口1个SDI环出转接口&#xff0c;配件有&#xff1a; 1个转SDI转接线&#xff0c;PCI-E2.0 X4&#xff0c;分辨率最高可以达到1080P/60HZ,带SDK开发包&am…

计算机网络:应用层 - 文件传输协议 FTP 电子邮件

计算机网络&#xff1a;应用层 - 文件传输协议 FTP & 电子邮件 文件传输协议 FTP电子邮件 文件传输协议 FTP 文件传送协议 FTP(File Transfer Protocol)&#xff0c;曾是互联网祝频讲解上使用得最广泛的文件传送协议。 其特点是&#xff1a;若要存取一个文件&#xff0c;…

fastadmin中$searchFields解析

在控制器或者模型中添加这个属性&#xff1a; protected $searchFields goods_name,goods_brand,category.name,manystoreShop.name,goods_model; 查询sql拼接就会自携带&#xff1b;原理如下&#xff1a;

element-ui 表单的验证不生效可能有以下几种原因:v

表单验证规则没有正确设置&#xff1a;在 element-ui 表单组件中&#xff0c;需要通过设置 rules 属性来定义表单字段的验证规则&#xff0c;例如&#xff1a; <el-form :model"form" :rules"rules"><el-form-item label"用户名" prop…

算法基础精选题单 模拟 (个人题解)

前言&#xff1a; 从今天开始刷牛客上的这份题单&#xff0c;为暑假的牛客多校集训做准备&#xff0c;题单上一共有237道题&#xff0c;要想在集训开始前刷完难度还是很大的&#xff0c;但我一定会坚持下来&#xff0c;希望在这段时间内我能真正入门算法竞赛。接下来这三道题都…

操作系统实战(一)(PV经典问题之生产者与消费者)

&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客 &#x1f525; 系列专栏&#xff1a; &#x1f3c0;操作系统 &#x1f4aa;&#x1f3fb; 十二月的寒冬阻挡不了春天的脚步&#xff0c;十二点的黑夜遮蔽不住黎明的曙光 目录 前言 进程互斥与同步 题目一 题目二 题…

在SQL中使用explode函数展开数组的详细指南

目录 简介示例1&#xff1a;简单数组展开示例2&#xff1a;展开嵌套数组示例3&#xff1a;与其他函数结合使用处理结构体数组示例&#xff1a;展开包含结构体的数组示例2&#xff1a;展开嵌套结构体数组 总结 简介 在处理SQL中的数组数据时&#xff0c;explode函数非常有用。它…

C#——装箱与拆箱详情

装箱与拆箱 装箱: 将值类型转换成引用类型的过程&#xff1b; 拆箱: 把引用类型转为值类型的过程&#xff0c;就是拆箱 装箱 拆箱

洗地机哪个品牌好?四大实力拔尖单品力荐

洗地机哪个品牌好呢&#xff1f;想必姐妹们肯定觉得保持家里清洁是非常重要的&#xff0c;但是每天打扫卫生真的会让人整个都要疯狂&#xff0c;这不&#xff0c;救星洗地机就能派上用场了&#xff0c;干垃圾湿垃圾统统都能一次清理干净。只需轻轻一推&#xff0c;就能把扫地、…

帝国cms批量取消文章审核-把已审核的文章改成未审核的方法

帝国cms很多人采集的时候&#xff0c;把文章弄成了审核过的文章&#xff0c;或者因为其他的原因&#xff0c;文章都是审核通过&#xff0c;为了seo又不能把全部文章放出来&#xff0c;所以需要把文章弄成未审核以下就是解决本问题的办法 首先来修改后台列表文件&#xff0c;自…

栈,队列,数组,链表

一.数据结构概述 数据结构是计算机底层存储,组织数据的方式。 是指数据相互之间是以什么方式排列在一起的。 数据结构是为了更加方便的管理和使用数据,需要结合具体的业务场景来进行选择。 一般情况下,精心选择的数据结构可以来更高的运行或者存储效率。 二.学好数据结构三大…

Python基础-类与对象

1.面向对象的三大特性 封装继承多态 2.类与对象的理解与封装特性 类是事物抽象的集合&#xff0c;对象是事物具象的个体。&#xff08;类–>实例化–>对象&#xff09; 面向对象编程语言 类: 一个模板, (人类)—是一个抽象的&#xff0c; 没有实体的对象: (eg: 张三&a…

SQL题:未完成率较高的50%用户近三个月答卷情况

SQL题&#xff1a;未完成率较高的50%用户近三个月答卷情况 这是一道牛客网上SQL进阶图库中的一道困难题目&#xff0c;个人花了近两个小时才通过所有用例。之所以想记录下来是因为这道题算是一个很考验基本功的题目&#xff0c;也不乏一些SQL中的技巧。下面我们逐步分析&#…

java干货 线程池的分析和使用

文章目录 一、了解线程池1.1 什么是线程池1.2 为什么需要线程池 二、四种线程池的使用2.1 newFixedThreadPool2.2 newCachedThreadPool2.3 newSingleThreadExecutor2.4 newScheduledThreadPool 三、自定义线程池3.1 线程池七大核心参数3.2 线程池内部处理逻辑 一、了解线程池 …

Leetcode - 132双周赛

目录 一、3174. 清除数字 二、3175. 找到连续赢 K 场比赛的第一位玩家 三、3176. 求出最长好子序列 I 四、3177. 求出最长好子序列 II 一、3174. 清除数字 本题可以使用栈来模拟&#xff0c;遇到数字弹出栈顶元素&#xff0c;遇到字母入栈。 代码如下&#xff1a; //使用字…

VMware虚拟机卡顿(虚拟机卡死)(调整所有虚拟机内存使其适应预留的主机 RAM (F)、默认进程优先级、不允许使用内存页面修整功能(M))

文章目录 设置编辑——首选项——内存——额外内存——调整所有虚拟机内存使其适应预留的主机 RAM (F)&#xff08;我把这个勾上了&#xff09;编辑——首选项——优先级——默认进程优先级虚拟机——设置——选项——高级——不允许使用内存页面修整功能(M) 参考文章&#xff…

数据结构和算法之复杂度比较

数据结构和算法之复杂度比较 参考如下网址&#xff1a;https://www.bigocheatsheet.com/ 方便快速查询 1. 复杂度比较 2. 常见数据结构复杂度 3. 常见算法复杂度

【AI应用探讨】— 通义千问模型应用场景

目录 一、文字创作 二、文本处理 三、编程辅助 四、翻译服务 五、对话模拟 六、数据可视化 七、电商行业应用 八、教育行业应用 九、开发者与科研工作者应用 一、文字创作 故事、公文、邮件撰写&#xff1a;通义千问能够基于用户的指令和需求&#xff0c;生成符合要求…

如何用命令行方式便捷组合调用 AI 工作流?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 我给你演示的总结长视频、起草博客文章&#xff0c;只是其中的冰山一角。 焦虑 有些小伙伴最近跟我反馈&#xff0c;看到他人演示的样例&#xff0c;见识…