You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java订单应用定时自动从MySQL获取新订单实现方案问询

嘿,看起来你正在开发一个Java订单处理系统,我来帮你梳理一下核心的实现思路和代码示例,刚好贴合你提到的需求!

1. 核心实体类设计

咱们先定义订单(Order)和商品(Product)的模型类,完全匹配你说的结构:

import java.util.ArrayList;
import java.util.List;

// 商品类
class Product {
    private String productId;
    private String productName;
    private double price;

    // 构造器、getter/setter可根据需求补充
    public Product(String productId, String productName, double price) {
        this.productId = productId;
        this.productName = productName;
        this.price = price;
    }

    // 可添加toString方法方便调试
}

// 订单类
class Order {
    // 唯一标识:时间戳 + 客户ID,直接组合为字符串存储
    private String orderId;
    private long timestamp;
    private String customerId;
    private List<Product> products;

    public Order(long timestamp, String customerId, List<Product> products) {
        this.timestamp = timestamp;
        this.customerId = customerId;
        // 生成唯一订单ID:时间戳拼接客户ID
        this.orderId = timestamp + "_" + customerId;
        this.products = new ArrayList<>(products); // 避免外部修改内部集合
    }

    // 订单一般不建议修改,所以只提供getter方法
    public String getOrderId() {
        return orderId;
    }

    public long getTimestamp() {
        return timestamp;
    }

    public String getCustomerId() {
        return customerId;
    }

    // 返回不可变集合,防止外部篡改订单内的商品列表
    public List<Product> getProducts() {
        return List.copyOf(products);
    }
}
2. 定时轮询获取新订单

你需要每隔700ms检查并生成新订单,这里推荐用ScheduledExecutorService实现定时任务,它比传统Timer更灵活稳定,适配多线程场景:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class OrderProcessor {
    // 存储订单的ArrayList,注意:ArrayList本身非线程安全,多线程操作时要做同步处理
    private List<Order> orderList = new ArrayList<>();
    // 单线程定时任务池,足够应对轮询需求
    private ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();

    public void startProcessing() {
        // 初始化定时任务:立即启动,每隔700ms执行一次
        scheduler.scheduleAtFixedRate(this::fetchAndCreateNewOrders, 0, 700, TimeUnit.MILLISECONDS);
    }

    private void fetchAndCreateNewOrders() {
        // 这里是模拟获取新订单的逻辑,你可以替换成实际从消息队列、数据库等数据源拉取的代码
        List<Order> newOrders = simulateFetchingNewOrders();

        // 线程安全地添加新订单到列表
        synchronized (orderList) {
            orderList.addAll(newOrders);
        }

        // 可选:打印日志监控订单新增情况
        System.out.println("新增" + newOrders.size() + "个订单,当前总订单数:" + orderList.size());
    }

    // 模拟生成新订单的方法,实际场景替换为你的业务逻辑
    private List<Order> simulateFetchingNewOrders() {
        List<Order> newOrders = new ArrayList<>();
        // 生成一个测试订单
        List<Product> products = new ArrayList<>();
        products.add(new Product("P001", "Java核心技术", 99.9));
        products.add(new Product("P002", "Spring Boot实战", 89.9));
        long currentTimestamp = System.currentTimeMillis();
        newOrders.add(new Order(currentTimestamp, "C001", products));

        return newOrders;
    }

    // 对外提供订单列表的安全访问方法,返回副本避免外部修改原集合
    public List<Order> getOrderList() {
        synchronized (orderList) {
            return new ArrayList<>(orderList);
        }
    }

    // 程序关闭时调用的停止方法,优雅终止定时任务
    public void stopProcessing() {
        scheduler.shutdown();
        try {
            if (!scheduler.awaitTermination(1, TimeUnit.SECONDS)) {
                scheduler.shutdownNow();
            }
        } catch (InterruptedException e) {
            scheduler.shutdownNow();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        OrderProcessor processor = new OrderProcessor();
        processor.startProcessing();

        // 模拟运行10秒后停止
        TimeUnit.SECONDS.sleep(10);
        processor.stopProcessing();
    }
}
3. 关键注意事项
  • 线程安全:如果有多个线程同时读写订单列表,一定要做同步处理。上面用了synchronized块,你也可以直接用CopyOnWriteArrayList替代ArrayList,它本身就是线程安全的,更适合读多写少的场景。
  • 订单ID唯一性:如果同一客户在同一毫秒内多次下单,时间戳+客户ID会出现重复。如果需要更严格的唯一性,可以追加自增序列或UUID片段。
  • 定时任务可靠性:ScheduledExecutorService会处理任务超时情况,如果某次任务执行时间超过700ms,下一次任务会延迟执行,不会重叠,符合大多数订单处理场景的需求。

内容的提问来源于stack exchange,提问作者Apostolos Kouzoukos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:12:37