java实现消息队列的两种方式(小结)

yizhihongxing

下面是关于“Java实现消息队列的两种方式(小结)”的详细讲解:

1. 引言

消息队列是一种用于传递异步消息的通信方式,常被应用于一些高并发、大规模分布式系统中。Java作为一种广泛应用于企业级应用的编程语言,一定程度上受到了消息队列的青睐。在Java中,开发者可以使用各种规范和框架来实现消息队列,本文将介绍其中常见的两种方式。

2. Java Message Service (JMS)

Java Message Service (JMS) 是一种基于 Java 平台的消息服务 API 规范。它是标准的 Java API,由 Sun Microsystems 提供。JMS 定义了两种类型的消息队列:

  1. 点对点 (P2P) 模型
  2. 发布订阅 (Pub/Sub) 模型

P2P 模型示例

点对点模型在多个消费者之间共享消息。下面是一个简单的例子,展示如何通过点对点模型使用 JMS:

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

public class P2PExample implements MessageListener {
    public static void main(String args[]) throws Exception {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        connection.start();
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // create the destination (queue) and a producer
        Destination destination = session.createQueue("myQueue");
        MessageProducer producer = session.createProducer(destination);

        // send a message
        TextMessage message = session.createTextMessage();
        message.setText("Hello World!");
        producer.send(message);

        // create a consumer and register a message listener
        MessageConsumer consumer = session.createConsumer(destination);
        consumer.setMessageListener(new P2PExample());
    }

    public void onMessage(Message message) {
        // receive and process the message
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("Received message: " + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

在本示例中,我们使用了ActiveMQ作为 JMS 实现的消息中间件。在这里,我们创建了一个队列,向该队列中发送了一条消息。我们还创建了一个使用队列的消费者,并注册了一个消息监听器。在实际使用中,一个应用程序可以有多个消费者,以便更大限度地处理消息。

Pub/Sub 模型示例

发布-订阅模型则是将消息广播给所有订阅者。下面是一个简单的例子,展示如何使用 JMS 实现发布-订阅模型:

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

public class PubSubExample implements MessageListener {
    public static void main(String args[]) throws Exception {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
        Connection connection = connectionFactory.createConnection();
        connection.start();

        // create a session and two destinations (topics)
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
        Destination destination = session.createTopic("myTopic");
        Destination anotherDestination = session.createTopic("myAnotherTopic");

        // create a publisher and subscribe to both topics
        MessageProducer publisher = session.createProducer(destination);
        MessageConsumer subscriber1 = session.createConsumer(destination);
        subscriber1.setMessageListener(new PubSubExample());
        MessageConsumer subscriber2 = session.createConsumer(anotherDestination);
        subscriber2.setMessageListener(new PubSubExample());

        // send a message to the first topic
        TextMessage message = session.createTextMessage();
        message.setText("Hello World!");
        publisher.send(message);
    }

    public void onMessage(Message message) {
        // receive and process the message
        if (message instanceof TextMessage) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println("Received message: " + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}

在本示例中,我们同样使用了 ActiveMQ 作为 JMS 实现的消息中间件。在这里,我们创建了两个主题(即topics),并创建了一个使用主题的生产者。我们还向两个主题连接了订阅者,并通过消息监听器接收并处理消息。与点对点模型类似,一个应用程序可以连接多个主题并订阅其消息。

3. Apache Kafka

Kafka 是一个分布式的快速消息队列和流处理平台。由于其分布式特性和高可用性,Kafka 在如今的分布式数据处理领域中愈发受到开发者的青睐。下面是一个简单的示例程序,展示了 Kafka 的使用方法。

Kafka Producer 示例

import java.util.Properties;
import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

public class KafkaProducerExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);

        Producer<String, String> producer = new KafkaProducer<String, String>(props);
        producer.send(new ProducerRecord<String, String>("myTopic", "Hello World!"));
        producer.close();
    }
}

在本示例中,我们首先设定了 Kafka 生产者的一些属性,包括 bootstrap.servers(设置了 Kafka 集群中 Kafka broker 的地址和端口)、key.serializer、value.serializer 等。我们还实例化了一个 High-Level Kafka 生产者并向其中发送了一条消息。

Kafka Consumer 示例

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
import org.apache.kafka.clients.consumer.*;
import org.apache.kafka.common.serialization.StringDeserializer;

public class KafkaConsumerExample {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "testGroup");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);

        Consumer<String, String> consumer = new KafkaConsumer<String, String>(props);
        consumer.subscribe(Collections.singleton("myTopic"));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }
}

在本示例中,我们同样设定了 Kafka 消费者的一些属性,包括 bootstrap.servers、group.id、key.deserializer、value.deserializer 等。我们还创建了一个 High-Level Kafka 消费者并订阅了一个主题。在主循环中,我们通过 Kafka 拉取机制消费了主题中的消息。

4. 结论

本文介绍了 Java 实现消息队列的两种方式:使用 JMS 和使用 Kafka。在实际开发中,开发者可以根据系统的要求、业务场景、团队技术水平等综合考虑,并灵活选择适合的方式。无论选用何种方式,基本的原则都是一致的:即在异步通信的场景中,应该使用消息队列来解耦发送者和接收者,并支持横向扩展和高可用性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现消息队列的两种方式(小结) - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • 如何在Android studio导入jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等

    1、如何获取jdk9及以上版本中依赖包,如’rt.jar’,’ dt.jar’等 ​ 在jdk9及后续版本中,jdk开始使用模块化规则,实现更好的封装和定义良好的接口,近一步加强了java的自由度,开发者可以定制化SDK ​ 包括rt.jar在内的依赖均已移除,以模块化形式更高效的存诸在 JAVA_HOME/jmods目录下 ​ 如果需要可以用命令进行抽取,…

    Java 2023年4月25日
    00
  • 简易JDBC框架实现过程详解

    下面我来为你详细讲解一下“简易JDBC框架实现过程详解”的完整攻略。 1. 概述 JDBC是一种Java数据库连接机制,它允许Java应用程序通过执行SQL语句与数据库进行交互。JDBC API提供了访问和处理所有类型的关系型数据库管理系统(RDBMS)的标准方法。在实际开发中,使用JDBC API进行数据库操作的过程显得有些繁琐,因此我们可以考虑封装一些工…

    Java 2023年5月19日
    00
  • Java外观模式解读,让你的代码优雅又高效

    Java 外观模式解读,让你的代码优雅又高效 什么是外观模式? 外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂系统中的一组子系统。这种类型的设计模式属于结构型模式,因为它可以为系统提供一个简单的接口,以隐藏系统的复杂性,使得客户端可以更加方便地访问系统。 为什么要使用外观模式? 在项目开发过程中,当我们的系…

    Java 2023年5月31日
    00
  • java线程间通讯的一些方法总结

    关于“Java线程间通讯的一些方法总结”的攻略,我从以下几点进行详细讲解: 一、线程间通讯的基本概念 1. 定义 线程间通讯指的是多个线程之间相互发送信息(数据)的行为。每个线程需要知道其他线程的存在以及如何与其他线程进行通信。 2. 通讯方法 实现线程间通讯的方法有以下几种: 共享变量 管道通信 消息队列 信号量 事件(条件) 二、共享变量的线程间通讯 1…

    Java 2023年5月26日
    00
  • Springboot WebFlux集成Spring Security实现JWT认证的示例

    下面是关于“Springboot WebFlux集成Spring Security实现JWT认证的示例”的完整攻略。 一、简介 在开始之前,先简单介绍一下SpringBoot和SpringSecurity。 SpringBoot:是Spring官方提供的一个快速开发框架,它能够极大地简化项目的搭建和配置,提高开发效率。 SpringSecurity:是Spr…

    Java 2023年5月20日
    00
  • Java FastJson使用教程

    Java FastJson使用教程 什么是FastJson? FastJson是阿里巴巴的开源JSON处理库,它能够将Java对象转换成JSON格式的数据,也可以将JSON格式的数据转换成Java对象。FastJson处理速度极快,是目前Java平台上最快的JSON处理器之一。 FastJson的安装和配置 最简单的方法是通过Maven来引入FastJson…

    Java 2023年5月26日
    00
  • Java数据结构之选择排序算法的实现与优化

    Java数据结构之选择排序算法的实现与优化 选择排序算法的原理 选择排序是一种简单直观的排序算法,它的基本思想是:从待排序的数据中选出最小的数,将其放在首位;再从剩余的数据中选出最小的数,放在已排序数据的末尾;以此类推,直到所有数据均已排序完毕。 选择排序的时间复杂度为O(n²),空间复杂度为O(1)。相比于其他排序算法,选择排序的代码实现简单、易于理解。 …

    Java 2023年5月19日
    00
  • Java实现大数运算的实例代码

    下面是详细的Java实现大数运算的攻略: 什么是大数运算? 在Java中,整型(int)类型的最大值是2147483647,当需要运用的数远远超过这个数值的时候会出现数字溢出问题,需要使用大数运算。 大数运算是指运算的数字超出了标准数据类型的范围,因此需要通过特定的算法进行处理,以达到能够正确显示和计算数值的目的。 Java中的大数运算实现方法 Java中的…

    Java 2023年5月30日
    00
合作推广
合作推广
分享本页
返回顶部