news 2026/5/1 10:15:41

Java开发中的消息通讯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java开发中的消息通讯

在java开发中,要实现事件驱动,即当发生按特定事件时,通知关联方以便作出改变,有三种方案:

一、分析对比

1、观察者模式;

2、Redis 订阅机制;

3、专业版 MQ。

下面逐一进行介绍并总结其各自的适用场景。

1. Java 观察者模式(Observer Pattern)

这是设计模式层面的一种行为型模式,核心是实现「一对多」的对象依赖关系:当一个对象(被观察者 / Subject)状态发生变化时,所有依赖它的对象(观察者 / Observer)会被自动通知并更新。

核心特点:
  • 内存内同步通信:观察者和被观察者都运行在同一个 JVM 进程内,通知是同步的(被观察者通知完所有观察者后,自身方法才会返回)。
  • 耦合度低:基于接口编程(Subject/Observer 接口),观察者和被观察者只需依赖接口,无需知道对方具体实现。
  • 无持久化 / 重试:通知过程仅在内存中完成,若观察者处理失败,被观察者不会重试,也无消息持久化能力。

简单代码示例:

import java.util.Observable; import java.util.Observer; // 被观察者:发布消息的对象 class MessageSubject extends Observable { public void publishMessage(String msg) { // 标记状态变化 setChanged(); // 通知所有观察者 notifyObservers(msg); } } // 观察者1:接收并处理消息 class MessageObserver1 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("观察者1收到消息:" + arg); } } // 观察者2:接收并处理消息 class MessageObserver2 implements Observer { @Override public void update(Observable o, Object arg) { System.out.println("观察者2收到消息:" + arg); } } // 测试 public class ObserverDemo { public static void main(String[] args) { MessageSubject subject = new MessageSubject(); // 注册观察者 subject.addObserver(new MessageObserver1()); subject.addObserver(new MessageObserver2()); // 发布消息 subject.publishMessage("Hello 观察者模式"); } }

输出

观察者2收到消息:Hello 观察者模式

观察者1收到消息:Hello 观察者模式

从中可以看出消息的处理顺序是随机的。

2. Redis 订阅 / 发布机制(Pub/Sub)

Redis 提供的轻量级消息通信机制,核心是「频道(Channel)」:发布者向指定频道发送消息,所有订阅该频道的客户端都会收到消息。

核心特点:
  • 跨进程 / 跨机器通信:基于 Redis 服务端中转,支持不同进程、不同机器的客户端通信。
  • 无持久化 / 无确认机制:消息发送后若没有订阅者,消息直接丢失;Redis 不会记录消息,也不保证订阅者一定收到(如客户端断连)。
  • 轻量简单:无需复杂配置,适合低可靠性要求的场景(如实时通知、状态同步)。

简单使用示例(Redis CLI):

# 终端1:订阅频道 "news" redis-cli SUBSCRIBE news # 终端2:向频道 "news" 发布消息 redis-cli PUBLISH news "Redis 发布订阅测试" # 终端1 会收到: # "message" # "news" # "Redis 发布订阅测试"
3. 专业版 MQ(以 RabbitMQ 为例)

RabbitMQ 是基于 AMQP 协议的重量级消息中间件,核心是「消息队列」:消息由生产者发送到队列,消费者从队列获取消息,中间件提供完善的消息管控能力。

核心特点:
  • 高可靠性:支持消息持久化(磁盘存储)、消息确认(ACK)、重试机制,确保消息不丢失。
  • 异步解耦:生产者发送消息后无需等待消费者处理,中间件缓存消息,消费者按需消费。
  • 丰富的路由策略:支持交换机(Direct/Fanout/Topic)、队列绑定,可实现复杂的消息路由(如按规则分发给不同消费者)。
  • 集群 / 高可用:支持集群部署,避免单点故障,适合高并发、高可靠性要求的生产环境。
简单代码示例(Java + RabbitMQ):
import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback; public class RabbitMQDemo { private static final String QUEUE_NAME = "test_queue"; // 生产者:发送消息 public static void sendMessage() throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); // Redis 服务地址 try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { // 声明队列(持久化) channel.queueDeclare(QUEUE_NAME, true, false, false, null); String message = "RabbitMQ 测试消息"; // 发送消息 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println("生产者发送消息:" + message); } } // 消费者:接收消息 public static void receiveMessage() throws Exception { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, true, false, false, null); System.out.println("消费者等待接收消息..."); // 消息回调处理 DeliverCallback deliverCallback = (consumerTag, delivery) -> { String message = new String(delivery.getBody(), "UTF-8"); System.out.println("消费者收到消息:" + message); // 手动确认消息已处理(确保不重复消费) channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); }; // 消费消息(关闭自动确认) channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {}); } public static void main(String[] args) throws Exception { // 启动生产者 sendMessage(); // 启动消费者 receiveMessage(); } }

二、三者核心对比

维度Java 观察者模式Redis 订阅 / 发布RabbitMQ(专业 MQ)
通信范围单 JVM 进程内跨进程 / 跨机器跨进程 / 跨机器
可靠性无重试 / 无持久化无重试 / 无持久化有重试 / 有持久化 / ACK
耦合度低(接口解耦)极低(Redis 中转)极低(队列解耦)
性能极高(内存通信)高(Redis 轻量)中(功能复杂)
适用场景单进程内状态通知轻量实时通知、低可靠高并发、高可靠业务场景
核心定位设计模式(代码层面)轻量消息工具企业级消息中间件

三、总结

  1. Java 观察者模式是「代码层面」的解耦方案,仅适用于单进程内的消息通知,无跨进程能力;
  2. Redis 订阅机制是「轻量跨进程」的消息工具,适合低可靠性要求的实时通知,不适合核心业务;
  3. RabbitMQ 等专业 MQ是「企业级」的消息中间件,提供完善的可靠性保障,是核心业务异步解耦、削峰填谷的首选。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 6:12:15

从百模大战到行业落地:中国电信大模型实践全解析

中国电信通过行业协同、数据提质和智算筑基三大路径,推动大模型从实验室走向实际应用。通过注入行业数据优化基础大模型,已在车联网、医疗等领域落地80多个行业大模型。构建"星海"数据智能中台和"息壤"智算服务平台,提供…

作者头像 李华
网站建设 2026/5/1 6:12:44

程序员必学:央国企大模型落地趋势与高价值场景分析(收藏版)

央国企在传统领域大规模应用大模型,注重技术自主可控。AI应用转向垂类场景建设,国资委明确智慧能源、交通物流和医药医疗为最高优先级。工业领域大模型密集落地,2025年实现翻倍增长。能源电力类聚焦电网预测等,制造类聚焦研发仿真…

作者头像 李华
网站建设 2026/4/24 16:10:05

救命!虎贲等考AI PPT封神✨ 开题/答辩/汇报再也不用熬夜排版

作为深耕论文写作科普的博主,每天都要接住无数论文党的崩溃求助,其中高频吐槽TOP1绝对是:“论文改完了,PPT要熬死我了😭”谁懂啊!做学术PPT真的是科研路上的隐形内耗——开题PPT逻辑乱到被导师打回&#xf…

作者头像 李华
网站建设 2026/4/25 11:33:10

电机故障诊断(python程序,模型为CNN结合LSTM)

代码运行环境要求:TensorFlow版本>2.4.0,python版本>3.6.0 运行效果视频:电机故障诊断(python代码)_哔哩哔哩_bilibili 1.电机常见的故障类型有以下几种: 轴承故障:轴承是电机运转时最容…

作者头像 李华