Java 实现订单 30 分钟未支付自动取消:定时任务 + 数据库轮询
实现订单 30 分钟未支付自动取消,可以使用定时任务和数据库查询来实现。具体实现步骤如下:
-
创建一个定时任务,每隔一段时间(例如 1 分钟)查询数据库中未支付的订单,并判断订单是否超过 30 分钟未支付。
-
如果订单超过 30 分钟未支付,则将订单状态设置为取消,并更新数据库中的订单信息。
-
使用 Java 代码实现定时任务和数据库查询,可以使用 Spring 框架中的
@Scheduled注解和JdbcTemplate类来实现。具体代码如下:
import java.util.List;
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Component
public class OrderCancelTask {
@Autowired
private JdbcTemplate jdbcTemplate;
@Scheduled(fixedRate = 60000) // 每隔 1 分钟执行一次
@Transactional
public void cancelUnpaidOrders() {
Date now = new Date();
Date thirtyMinutesAgo = new Date(now.getTime() - 30 * 60 * 1000); // 30 分钟前的时间
List<Order> unpaidOrders = jdbcTemplate.query(
"SELECT * FROM orders WHERE status = 'unpaid' AND create_time < ?",
new Object[]{thirtyMinutesAgo},
new OrderRowMapper()); // 查询 30 分钟未支付的订单
for (Order order : unpaidOrders) {
order.setStatus('cancelled'); // 将订单状态设置为取消
jdbcTemplate.update(
"UPDATE orders SET status = 'cancelled' WHERE id = ?",
new Object[]{order.getId()}); // 更新订单状态到数据库
}
}
}
上面的代码使用了 @Scheduled 注解来实现定时任务,每隔 1 分钟执行一次。使用 JdbcTemplate 类来查询数据库中未支付的订单,并使用事务来保证更新订单状态的原子性。具体查询语句和更新语句根据实际需求来编写。
原文地址: https://www.cveoy.top/t/topic/ndan 著作权归作者所有。请勿转载和采集!