首页 > 编程语言 >Java 消息队列详解

Java 消息队列详解

时间:2024-06-21 10:00:57浏览次数:16  
标签:Java String 队列 详解 消息 import new message

什么是消息队列?

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

消息队列的关键概念

  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 消息队列及其应用场景。

标签:Java,String,队列,详解,消息,import,new,message
From: https://blog.csdn.net/qq_36858666/article/details/139734790

相关文章

  • Redis集群搭建及原理详解
    1.Redis集群方案比较1.1哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断......
  • 032java jsp ssm大学生第二课堂成绩单系统学生思想道德技术修养文体活动管理(源码+数据
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 026java jsp ssm网络硬盘系统网站系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 027java jsp ssm洗衣店管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • 023java jsp ssm学校园教室管理系统(源码+数据库+文档)
     项目技术:SSM+Maven等等组成,B/S模式+Maven管理等等。环境需要1.运行环境:最好是javajdk1.8,我们在这个平台上运行的。其他版本理论上也可以。2.IDE环境:IDEA,Eclipse,Myeclipse都可以。推荐IDEA;3.tomcat环境:Tomcat7.x,8.x,9.x版本均可4.硬件环境:windows7/8/101G......
  • java httpsession
    bychatgpt=>HttpSessionHttpSession是JavaServletAPI提供的一个接口,用于管理与单个用户相关的会话信息。会话(session)是在服务器端保存的与客户端用户交互的一系列请求和响应之间的状态信息。以下是HttpSession的详细解释:HttpSession的作用HttpSession用于在用户的多......
  • java读取wps嵌入式图片思路
     这个只写了思路具体代码在文章最后,不想了解得直接去拿代码了解Excel数据结构    Excel文件格式后缀xls,xlsx其实是一个压缩文件,是由多个文件夹以及xml文件组合为一个文件,xml文件记录了Excel得内容以及样式等信息。加入在桌面新建一个xlsx文件,然后插入一个嵌入......
  • 秋招Java后端开发冲刺——基础篇2
    Java语言基础一、基本数据类型(8个)整型:byte(1字节)、short(2字节)、int(4字节)、long(8字节,使用时一定要在数值后面加上L)注:整型类型的最高位表示数据符号位,因此实际上数据的表示范围为(−......
  • 《JAVA 程序设计语言学习心得》
    在信息科技高速发展的当下,我怀着对编程世界的强烈好奇和探索欲望,开启了JAVA程序设计语言的学习之旅。一、学习JAVA程序设计语言的背景和动机随着数字化时代的来临,编程技能在各个领域的重要性日益凸显。我意识到掌握一门强大的编程语言,不仅能够提升自己的逻辑思维和解决问......
  • 基于Java的图书管理系统源码( GUI+JavaSwing+MySql )
    基于Java的图书管理系统源码(GUI+JavaSwing+MySql)1、使用JavaSwing,Mysql实现2、IDEA编写,eclipse也可以运行(测试使用的IDEA24.1.3)3、测试环境:JDK1.8(JDK20),MySQL5.54、本项目实现了注册、登录、图书馆数据维护、新书订购、借阅管理、系统维护等功能=============......