使用java做订单失效(指定一段时间后)

Java实现订单一小时后自动失效
本文分享了如何在公司项目中利用Java编写代码,实现订单在一小时有效期后自动变为失效状态,以满足业务需求。

本人所在的公司有个需求是订单为1小时有效期,过了有效期之后订单即置为失效,代码贴出来跟大家分享一下

import java.util.concurrent.TimeUnit;

public class OrderTest {
    public static void main(String[] args) {
        for(int i = 1;i <= 10;i++){
            final int id = i;
            new Thread(new Runnable(){
                @Override
                public void run() {
                    System.out.println(System.currentTimeMillis());
                    new Order(id,new ScheduleTime(3, TimeUnit.SECONDS),0);
                }
            }).start();
        }
    }
}

/**
 * 订单类
 * @author pipi
 *
 */
public class Order {
    private Integer id; //订单id
    private Integer status; //订单状态,0为未付款,1为已付款,-1为已失效
    private ScheduleTime time;
    public Order(Integer id,ScheduleTime time,Integer status){
        this.id = id;
        this.time = time;
        this.status = status;
        OrderSchedule.getInstance().startTask(new OrderFailure(this), time);
    }

    public boolean isAlive(){
        return status != -1;
    }

    public Integer getId() {
        return id;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}

import java.util.concurrent.TimeUnit;

public class ScheduleTime {
    private long delay;
    private TimeUnit time;
    public ScheduleTime(long delay,TimeUnit time){
        this.delay = delay;
        this.time = time;
    }
    public long getDelay() {
        return delay;
    }
    public void setDelay(long delay) {
        this.delay = delay;
    }
    public TimeUnit getTime() {
        return time;
    }
    public void setTime(TimeUnit time) {
        this.time = time;
    }

}

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * 调度器
 * @author pipi
 *
 */
public class OrderSchedule {
    private static ScheduledExecutorService Manager;
    private static OrderSchedule orderSchedule;

    static{
        Manager = Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors());
    }

    private OrderSchedule(){
    }

    public synchronized static OrderSchedule getInstance(){
        if(orderSchedule == null){
            orderSchedule = new OrderSchedule();
        }
        return orderSchedule;
    }

    /**
     * 预约订单时调用,一段时间后订单失效
     */
    public void startTask(OrderFailure task,ScheduleTime time){
        Manager.schedule(task,time.getDelay(),time.getTime());
    }
}

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 订单失效操作
 * @author pipi
 *
 */
public class OrderFailure implements Runnable{
    private Order order;
    private static Lock lock = new ReentrantLock();
    public OrderFailure(Order order){
        this.order = order;
    }

    @Override
    public void run() {
        if(order.getStatus() == 1) System.out.println("订单已付款,不执行失效任务");
        else{
            lock.lock();
            try{
                order.setStatus(-1);
                System.out.println("id为" + order.getId() + "的订单,失效任务执行");
                System.out.println(System.currentTimeMillis());
            }finally{
                lock.unlock();
            }


        }
    }

    /**
     * 返回订单是否付款
     * @return
     */
    public boolean isPay(){
        if(order.getStatus() == 1) return true;
        else return false;
    }
}
在“苍穹外卖”项目中,运行一段时间后出现报错是较为常见的问题,通常与资源管理、数据库连接、缓存机制或代码逻辑设计相关。以下是一些可能的原因分析及对应的解决方案: ### 1. **数据库连接池耗尽** 系统在长时间运行后,可能出现数据库连接未被正确释放的情况,导致连接池中的连接被耗尽,后续请求无法获取数据库连接。 **原因分析:** - 数据库连接未在操作完成后关闭。 - 使用了未正确配置的连接池(如HikariCP、Druid等),未设置合理的最大连接数和超时时间。 **解决方案:** - 确保每次数据库操作完成后都调用`close()`方法释放连接。 - 检查连接池配置文件,设置合适的最大连接数(如`maximumPoolSize`)和空闲超时时间(如`idleTimeout`)。 - 在Spring Boot项目中,可以通过`application.yml`配置连接池参数: ```yaml spring: datasource: hikari: maximum-pool-size: 20 idle-timeout: 30000 max-lifetime: 1800000 ``` ### 2. **内存泄漏或频繁Full GC** 长时间运行后,系统可能出现内存泄漏,导致频繁的Full GC甚至OOM(Out Of Memory)错误。 **原因分析:** - 缓存数据未设置过期策略,导致内存中堆积大量无用对象。 - 静态集合类(如`static Map`)不断添加对象而未清理。 - 使用了未关闭的流(如文件流、网络流)。 **解决方案:** - 使用内存分析工具(如MAT、VisualVM)进行堆栈分析,定位内存泄漏点。 - 对缓存数据设置过期时间使用`Caffeine`或`Ehcache`等具备自动清理机制的缓存框架。 - 避免在静态集合中无限制添加对象,或设置合理的清理策略。 - 确保所有资源流在使用完毕后正确关闭。 ### 3. **Redis缓存穿透、击穿或雪崩** 当系统依赖Redis缓存时,可能出现缓存失效导致大量请求直接穿透到数据库,进而引发数据库压力过大甚至宕机。 **原因分析:** - 缓存中不存在某些数据(如恶意请求),导致请求直达数据库。 - 热点数据缓存失效瞬间,大量并发请求涌入数据库。 - 多个缓存同时失效,造成数据库短时间内承受大量请求。 **解决方案:** - 对查询参数进行合法性校验,防止缓存穿透。 - 使用互斥锁(如Redis的`SETNX`)控制缓存重建。 - 给热点数据设置永不过期或逻辑过期时间。 - 缓存过期时间设置随机偏移,避免大量缓存同时失效。 ### 4. **定时任务执行异常或阻塞主线程** 如果系统中存在定时任务(如订单状态更新、库存同步等),任务执行异常或长时间阻塞可能影响主业务流程。 **原因分析:** - 定时任务中执行了耗时操作,未使用异步处理。 - 异常未被捕获,导致任务中断且后续不再执行。 - 多个定时任务并发执行,争夺资源导致死锁或资源竞争。 **解决方案:** - 将耗时任务放入线程池中异步执行。 - 在任务中加入全局异常捕获机制,防止任务因异常终止。 - 使用分布式任务调度框架(如Quartz、XXL-JOB)管理任务调度。 - 合理设置任务执行间隔,避免多个任务同时触发。 ### 5. **文件资源未释放或路径错误** 在导出Excel文件或处理上传下载功能时,可能出现文件流未关闭或路径配置错误的问题。 **原因分析:** - 文件流未正确关闭,导致系统资源耗尽。 - 文件路径配置错误,运行一段时间后文件无法访问。 - 模板文件未放置在指定位置或名称拼写错误。 **解决方案:** - 使用`try-with-resources`语句确保文件流正确关闭。 - 检查文件路径配置,确保路径与实际部署环境一致。 - 在代码中打印当前文件路径,确认是否正确加载模板文件: ```java System.out.println("模板文件路径:" + templatePath); ``` ---
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值