当前位置: 首页 > article >正文

商城系统通过Kafka消息队列,实现订单的处理和状态更新

以下是一个简单的Spring Boot应用程序示例,演示如何使用Kafka实现订单的处理和状态更新。

首先,我们创建一个名为“order”的topic,在application.yaml配置文件中添加Kafka的配置:

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: order-group
      auto-offset-reset: earliest
    producer:
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    template:
      default-topic: order

在这里,我们指定了Kafka的地址和消费者组ID,并设置了生产者消息的序列化器和默认主题为“order”。

接下来,我们创建一个名为“Order”的Java类,来表示订单对象:

public class Order {
    private String orderId;
    private String userId;
    private String productId;
    private int quantity;
    private double price;
    private OrderStatus status;
    private String createTime;
    // getter、setter、toString
}

此外,我们还需要一个枚举类来表示订单的状态:

public enum OrderStatus {
    CREATED, PAID, CANCELLED, COMPLETED
}

然后,我们创建一个名为“OrderMessage”的Java类,来表示消息对象:

public class OrderMessage {
    private Order order;
    private OrderStatus status;
    // getter、setter、toString
}

接下来,我们创建一个名为“OrderService”的Java类,来处理订单的创建和状态更新操作:

@Service
public class OrderService {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void createOrder(Order order) {
        // 1、将订单信息发送到“order”主题中
        kafkaTemplate.send("order", order.toString());
        // 2、更新订单状态为“待支付”
        OrderMessage message = new OrderMessage();
        message.setOrder(order);
        message.setStatus(OrderStatus.CREATED);
        // 3、将订单状态更新消息发送到“order-status-update”主题中
        kafkaTemplate.send("order-status-update", message.toString());
    }

    @KafkaListener(topics = "order-status-update")
    public void handleOrderStatusUpdate(String message) {
        // 1、获取订单状态更新消息
        OrderMessage orderMessage = convertToOrderMessage(message);
        // 2、更新订单状态
        OrderStatus status = orderMessage.getStatus();
        Order order = orderMessage.getOrder();
        // 3、将订单信息更新到数据库中
        updateOrderStatus(order, status);
        // 4、如果订单状态为“已支付”,则执行后续操作
        if (status == OrderStatus.PAID) {
            // 生成物流信息
            generateLogisticsInfo(order);
            // 发送支付成功通知
            sendPaymentSuccessNotification(order);
        }
    }

    private OrderMessage convertToOrderMessage(String message) {
        // 解析订单状态更新消息
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.readValue(message, OrderMessage.class);
        } catch (Exception e) {
            throw new RuntimeException("Failed to convert message to OrderMessage: " + message, e);
        }
    }

    private void updateOrderStatus(Order order, OrderStatus status) {
        // 更新订单状态到数据库中
    }

    private void generateLogisticsInfo(Order order) {
        // 生成物流信息
    }

    private void sendPaymentSuccessNotification(Order order) {
        // 发送支付成功通知,可以通过发短信,邮箱通知
    }
}

在这里,我们使用了@Autowired注解注入了KafkaTemplate对象,它是一个用于发送消息到Kafka的模板类。createOrder方法中,我们首先将订单信息发送到“order”主题中,然后更新订单状态为“待支付”,并将订单状态更新消息发送到“order-status-update”主题中。handleOrderStatusUpdate方法使用@KafkaListener注解订阅了“order-status-update”主题,当有新的订单状态更新消息到达时,会自动触发该方法。在该方法中,我们获取订单状态更新消息,更新订单状态,并将订单信息更新到数据库中。如果订单状态为“已支付”,则会执行后续操作,例如生成物流信息、发送支付成功通知等。

最后,我们可以编写一个简单的Controller类,来接收用户的下单请求:

@RestController
public class OrderController {
    @Autowired
    private OrderService orderService;

    @PostMapping("/order")
    public ResponseEntity<?> createOrder(@RequestBody Order order) {
        orderService.createOrder(order);
        return ResponseEntity.ok().build();
    }
}

在这里,我们使用了@PostMapping注解来定义HTTP POST请求,接收一个Order对象作为请求体。当有新的下单请求到达时,我们会调用OrderService的createOrder方法,将订单信息发送到Kafka中,并返回一个成功响应。

到此,我们就完成了通过Kafka消息队列,实现订单的处理和状态更新的代码示例。


http://www.kler.cn/a/154038.html

相关文章:

  • 海量数据面试题
  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit
  • 云原生周刊:Kubernetes v1.32 要来了
  • 每日一练 | 包过滤防火墙的工作原理
  • 什么是SMARC?模块电脑(核心板)规范标准简介三
  • 2025年法定节假日日历
  • 快速掌握Pyqt5的9种显示控件
  • 2243:Knight Moves
  • postman接口测试教程与实例分享
  • mysql查询用户每年每月的订单数量及订单金额
  • 解决Flutter报错boxconstraints has non-normalized height/width constraints
  • 设计模式-结构型模式之组合、享元设计模式
  • 最长连续递增序列
  • [学习记录]Node event loop 总结流程图
  • STL--位图的介绍与使用
  • 以热爱的态度对待生活,就是最自己的温柔
  • 软著项目推荐 深度学习疲劳驾驶检测 opencv python
  • 线程的状态
  • 详解原生Spring框架下的方法切入点表达式
  • 【IEEE出版|往届均已成功EI检索】2024年第四届消费电子与计算机工程国际学术会议(ICCECE 2024)
  • 智慧工地一体化解决方案(里程碑管理)源码
  • 背包9讲系列2-完全背包问题
  • 《论文阅读》DualGATs:用于对话中情绪识别的双图注意力网络
  • 正确理解MySQL的MVCC及实现原理
  • 八、Lua数组和迭代器
  • 【微软技术栈】数据并行和任务并行中的潜在缺陷