文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Spring Boot中实现订单30分钟自动取消的策略思路及源代码

2024-11-30 04:26

关注

方式一:使用定时任务

代码实现如下:

首先,我们定义一个实体类Order,包含基本信息以及订单的创建时间:

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    
    // 其他字段...
    
    private LocalDateTime createdTime;
}

然后,我们定义一个定时任务类,用于定时查询并取消过期的订单:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class OrderCancellationTask {
    
    @Scheduled(fixedRate = 30 * 60 * 1000)  // 每30分钟执行一次
    public void cancelExpiredOrders() {
        // 在这里编写查询并取消过期订单的逻辑...
    }
}

接下来,我们可以在定时任务中编写查询并取消过期订单的逻辑。首先,使用JPA查询出所有待处理的订单:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class OrderService {
    @Autowired
    private OrderRepository orderRepository;
    
    // ...其他方法...
    
    public List findOrdersToCancel() {
        LocalDateTime三十分钟前 = LocalDateTime.now().minusMinutes(30);  // 当前时间30分钟前的时间戳
        return orderRepository.findByStatusAndCreatedTimeBefore(OrderStatus.PENDING,三十分钟前);  // 查询出所有待处理且创建时间早于30分钟前的订单
    }
}

然后,我们可以将查询出的过期订单的状态修改为"已取消":

@Service
public class OrderService {
    // ...其他方法...
    
    public void cancelOrders(List orders) {
        orders.forEach(order -> {  // 对每个查询出的订单进行处理
            order.setStatus(OrderStatus.CANCELED);  // 将订单状态修改为"已取消"
            orderRepository.save(order);  // 保存修改后的订单到数据库
        });
    }
}

最后,我们在定时任务中调用OrderService的cancelOrders方法,将查询出的过期订单的状态修改为"已取消":

@Component
public class OrderCancellationTask {
    @Autowired
    private OrderService orderService;
    
    @Scheduled(fixedRate = 30 * 60 * 1000)  // 每30分钟执行一次
    public void cancelExpiredOrders() {
        List orders = orderService.findOrdersToCancel();  // 查询出所有待处理的过期订单
        orderService.cancelOrders(orders);  // 将过期订单的状态修改为"已取消"并保存到数据库
    }
}

方式二:使用超时时间戳对比

在生成订单的时候,我们给订单增加一个超时时间戳字段。该字段表示订单可以允许被取消的时间。超过这个时间后,即不可再对订单进行取消操作。当尝试对过期订单进行取消操作时,我们会对比当前时间和这个超时时间戳。如果当前时间早于超时时间戳,则说明该订单已经过期,无法再被取消。如果当前时间晚于超时时间戳,则说明该订单还未过期,可以进行取消操作。这种方式相较于定时任务更加精确和高效。

首先,我们需要在订单类中添加一个表示超时时间戳的字段。这个字段将在订单生成时设定一个未来的时间点,表示订单可以取消的时间上限。

import java.time.LocalDateTime;

@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    // 其他字段...

    private LocalDateTime cancelTimestamp;  // 超时时间戳

    // 省略getter和setter...
}

接下来,我们需要一个服务类来处理订单的取消操作。这个服务类会检查订单是否过期,如果订单过期,那么就取消订单。

import org.springframework.stereotype.Service;

@Service
public class OrderCancellationService {
    public void cancelOrder(Order order) {
        if (isOrderExpired(order)) {
            // 订单已经过期,无法取消
            System.out.println("订单已过期,无法取消。");
        } else {
            // 订单未过期,可以进行取消操作
            System.out.println("订单取消成功。");
            // 在这里编写实际的取消操作逻辑...
        }
    }

    private boolean isOrderExpired(Order order) {
        return LocalDateTime.now().isAfter(order.getCancelTimestamp());
    }
}

在这个示例中,cancelOrder方法用于尝试取消订单。它首先调用isOrderExpired方法来检查订单是否过期。如果订单已经过期,那么就输出一条消息表示无法取消。否则,就进行实际的取消操作(在这个示例中只是输出一条成功消息,你需要根据实际情况来编写取消操作的代码)。

isOrderExpired方法用于检查订单是否过期。它比较当前时间和订单的超时时间戳,如果当前时间晚于超时时间戳,那么就表示订单已经过期。

你需要将这个示例中的订单类和Service类添加到你的项目中,并且配置好Spring和其他必要的依赖。同时,根据你的实际需求来调整超时时间戳的设定逻辑和取消操作的实现。

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯