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
相关产品推荐
相关产品推荐

