001 rabbitmq减库存demo direct

文章目录

Producer

这段代码定义了一个名为Producer的RESTful Web服务Controller,它提供了一个HTTP GET接口/direct/sendMsg,用于发送消息到RabbitMQ的交换机。当该接口被调用时,它会发送一个固定的消息字符串到名为myDirectExchangeAAA的交换机,并使用keyAAA作为RoutingKey。发送成功后,它会返回一个表示成功的字符串。

java 复制代码
// 声明一个包名,用于组织和管理Java类。  
package com.example.direct;  
  
// 导入Spring框架中RabbitMQ相关的RabbitTemplate类,它提供了发送和接收消息的方法。  
import org.springframework.amqp.rabbit.core.RabbitTemplate;  
  
// 导入Spring框架的自动装配注解,用于自动注入依赖。  
import org.springframework.beans.factory.annotation.Autowired;  
  
// 导入Spring Web模块的注解,用于映射HTTP GET请求到特定的处理方法。  
import org.springframework.web.bind.annotation.GetMapping;  
  
// 导入Spring Web模块的注解,用于定义Controller类的请求映射路径。  
import org.springframework.web.bind.annotation.RequestMapping;  
  
// 导入Spring Web模块的注解,用于标识一个类为RESTful Web服务的Controller。  
import org.springframework.web.bind.annotation.RestController;  
  
// 使用@RestController注解标识该类为RESTful Web服务的Controller,  
// 意味着此类将处理HTTP请求并返回数据。  
@RestController  
  
// 使用@RequestMapping注解定义该Controller的基础路径为"direct"。  
@RequestMapping("direct")  
  
// 声明一个名为Producer的公共类。  
public class Producer {  
  
    // 使用@Autowired注解自动注入RabbitTemplate的实例,  
    // 以便在类中使用RabbitMQ的功能。  
    @Autowired  
    private RabbitTemplate rabbitTemplate;  
  
    // 使用@GetMapping注解映射HTTP GET请求到sendMsg方法,  
    // 当访问"/direct/sendMsg"路径时,将调用此方法。  
    @GetMapping("sendMsg")  
  
    // 声明一个公共的sendMsg方法,该方法不接收任何参数,并返回一个字符串。  
    public String sendMsg(){  
  
        // 定义一个要发送的消息字符串。  
        String msg = "已经生成了订单,需要减去库存1个";  
  
        // 使用RabbitTemplate的convertAndSend方法发送消息到RabbitMQ交换机。  
        // 第一个参数是交换机的名称("myDirectExchangeAAA"),  
        // 第二个参数是RoutingKey("keyAAA"),用于确定消息应该路由到哪个队列,  
        // 第三个参数是要发送的消息内容(msg)。  
        rabbitTemplate.convertAndSend("myDirectExchangeAAA","keyAAA",msg);  
  
        // 返回一个表示消息发送成功的字符串。  
        return "send msg ok";  
    }  
}

Consumer

java 复制代码
package com.example.direct; // 声明包名为com.example.direct。  
  
import com.rabbitmq.client.Channel; // 导入RabbitMQ的Channel类,它代表了一个通信信道。  
  
import org.springframework.amqp.core.Message; // 导入Spring AMQP的Message类,表示一条消息。  
  
import org.springframework.amqp.rabbit.annotation.RabbitHandler; // 导入RabbitHandler注解,标识处理RabbitMQ消息的方法。  
  
import org.springframework.amqp.rabbit.annotation.RabbitListener; // 导入RabbitListener注解,用于监听RabbitMQ队列。  
  
import org.springframework.stereotype.Component; // 导入Spring的Component注解,标识该类为Spring的一个组件。  
  
import java.io.IOException; // 导入Java的IOException类,处理可能的输入输出异常。  
  
// 使用@Component注解将该类声明为Spring的一个组件,这样Spring会自动扫描并管理它。  
@Component   
public class Consumer { // 声明一个公共类Consumer。  
  
    // 使用@RabbitHandler注解标识该方法为处理RabbitMQ消息的方法。  
    // 使用@RabbitListener注解监听名为"queueAAA"的队列。  
    @RabbitHandler   
    @RabbitListener(queues = "queueAAA")   
    public void getMSg1(Message message, Channel channel){ // 定义一个公共方法getMSg1,接收一个Message和一个Channel作为参数。  
  
        try {  
            System.out.println("模拟库存业务处理减库存:" + message); // 打印接收到的消息。  
  
            Integer stock = 3;  
  
            int number = 10;   
  
            number -= stock; 
  
            // 消息确认:立马删除 消息。这是RabbitMQ的消息确认机制,确保消息被正确处理后可以安全删除。  
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), true);   
  
            System.out.println("减库存业务执行结束,队列消息已删除"); // 打印消息表示业务处理完毕且消息已被删除。  
  
        } catch (Exception e) { // 捕获所有异常。  
            try {  
                System.out.println("减库存业务有异常,消息重入队列"); // 打印异常信息。  
                // 当处理消息时发生异常,可以选择将消息重新放回队列以供后续处理。  
                // 这里basicReject的第二个参数为true,表示消息将重新入队。  
                channel.basicReject(message.getMessageProperties().getDeliveryTag(), true);   
            } catch (IOException ioException) { // 捕获可能的IO异常。  
                ioException.printStackTrace(); // 打印IO异常的堆栈信息。  
            }  
            e.printStackTrace(); // 打印原始异常的堆栈信息。  
        }  
    }  
}

RabbitMQDirectConfig.java

java 复制代码
package com.example.direct;


import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQDirectConfig {

//    1. 创建交换机
    @Bean
    public DirectExchange newDirectExchange(){
        return new DirectExchange("myDirectExchangeAAA",true,false);
    }

    //2. 创建队列
    @Bean
    public Queue newQueueA(){
        return new Queue("queueAAA",true);
    }

//3. 绑定队列到交换机中
    @Bean
    public Binding bindingA(){
        return BindingBuilder.bind(newQueueA()).to(newDirectExchange()).with("keyAAA");
    }


}

application.yaml

yaml 复制代码
server:
  servlet:
    context-path: /app
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    publisher-confirm-type: correlated  # 确认交换机已经接收到生产者的消息了
    publisher-returns: true   #  消息已经到了队列(交换机与队列绑定成功的)
    listener:
      simple:
        acknowledge-mode: manual # 手动消息确认

ServletInitializer.java

java 复制代码
package com.example;

import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;

public class ServletInitializer extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(RabbitmqApplication.class);
    }

}

RabbitmqApplication.java

java 复制代码
package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqApplication.class, args);
    }

}

pom.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>rabbitmq</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>rabbitmq</name>
    <description>rabbitmq</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>

        <!-- AMQP客户端 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
            <version>2.4.1</version>
        </dependency>



        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
相关推荐
用户8307196840824 小时前
Spring Boot 集成 RabbitMQ :8 个最佳实践,杜绝消息丢失与队列阻塞
spring boot·后端·rabbitmq
Java水解5 小时前
Spring Boot 视图层与模板引擎
spring boot·后端
Java水解5 小时前
一文搞懂 Spring Boot 默认数据库连接池 HikariCP
spring boot·后端
洋洋技术笔记9 小时前
Spring Boot Web MVC配置详解
spring boot·后端
初次攀爬者1 天前
Kafka 基础介绍
spring boot·kafka·消息队列
用户8307196840821 天前
spring ai alibaba + nacos +mcp 实现mcp服务负载均衡调用实战
spring boot·spring·mcp
Java水解1 天前
SpringBoot3全栈开发实战:从入门到精通的完整指南
spring boot·后端
用户8307196840822 天前
RabbitMQ vs RocketMQ 事务大对决:一个在“裸奔”,一个在“开挂”?
后端·rabbitmq·rocketmq
初次攀爬者2 天前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺2 天前
搞懂@Autowired 与@Resuorce
java·spring boot·后端