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

下面是关于“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日

相关文章

  • Java多线程下解决资源竞争的7种方法详解

    Java多线程下解决资源竞争的7种方法详解,可以分为以下几种: 1. 使用synchronized同步代码块 synchronized关键字可以修饰方法和代码块,保证在同一时间只有一个线程可以执行被synchronized关键字修饰的代码块或方法。使用synchronized关键字的示例代码如下: public synchronized void addCo…

    Java 2023年5月19日
    00
  • mybatis plus自动生成器解析(及遇到的坑)

    下面我将为你详细讲解 Mybatis Plus 自动生成器解析及遇到的坑。 1. 简介 Mybatis Plus 是一款基于 Mybatis 的快速开发框架,提供了常用的 CRUD 操作、分页、逻辑删除等功能,大大减少了代码量,提升了开发效率。而其中的代码生成器,更是可以帮助我们一键生成实体、Mapper、Service、Controller 等文件,减少了…

    Java 2023年6月2日
    00
  • 学习java编程后可以走哪些职业道路

    学习Java编程后可以走的职业道路非常广泛,除了Java开发工程师,还有Java架构师、Java测试工程师、Java运维工程师等职业。以下是学习Java编程的完整攻略,希望对你有所帮助。 1. 基础知识 Java编程语言是一门面向对象的编程语言,学习Java编程的基础知识是必须的。在学习过程中需要掌握Java的基本语法、面向对象思想、Java集合、Java …

    Java 2023年5月20日
    00
  • 五分钟教你手写 SpringBoot 本地事务管理实现

    手写Spring Boot本地事务管理实现 在Spring Boot应用程序中,我们可以使用本地事务管理来保证数据的一致性和完整性。本文将详细讲解手写Spring Boot本地事务管理实现的完整攻略,并提供两个示例。 1. 配置数据源和事务管理器 以下是配置数据源和事务管理器的基本流程: 在pom.xml文件中添加以下依赖: <dependency&g…

    Java 2023年5月15日
    00
  • 详解Spring Boot使用Maven自定义打包方式

    下面是详解Spring Boot使用Maven自定义打包方式的攻略: 1. 配置打包插件 在pom.xml文件中添加如下插件和依赖: <build> <plugins> <!– 配置打包插件 –> <plugin> <groupId>org.springframework.boot</gr…

    Java 2023年5月20日
    00
  • 关于@JsonProperty和@JSONField注解的区别及用法

    下面就是关于JsonProperty和JSONField注解的区别及用法的完整攻略。 1. 什么是 @JsonProperty 和 @JSONField 注解 @JsonProperty 和 @JSONField 都是用来指定属性名与 Json 中的名称对应关系的注解,但是前者是 Jackson 库中提供的注解,后者是阿里巴巴 fastjson 库中提供的注…

    Java 2023年5月26日
    00
  • Spring Boot中slf4j日志依赖关系示例详解

    好的!首先,我们来看一下如何在Spring Boot中使用slf4j日志依赖关系。 1. 什么是SLF4J? SLF4J(Simple Logging Facade for Java)是Java日志框架的一个抽象层,它允许应用程序在运行时使用任何日志框架,并且可以在不修改应用程序代码的情况下更改底层的日志框架。 2. 添加slf4j的依赖关系 要在Sprin…

    Java 2023年5月31日
    00
  • 浅谈序列化之protobuf与avro对比(Java)

    下面是浅谈序列化之protobuf与avro对比(Java)完整攻略: Introduction 在Java中,序列化是将对象转换为字节流方便存储和传输的过程。protobuf和avro是两种常用的序列化工具,它们都在大小、速度和兼容性等方面提供了很好的解决方案。在这篇文章中,我们将对它们进行简单的比较和对比,希望能够帮助读者选择适合自己项目的序列化工具。 …

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