package com.nq.utils.task.stock; import com.nq.service.UserPendingorderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 挂单定时任务 * 定时检查挂单条件,当价格达到目标价格时自动买入 */ @Component @Slf4j public class PendingOrderTask { @Autowired private UserPendingorderService userPendingorderService; private final Lock pendingOrderLock = new ReentrantLock(); private final AtomicBoolean isPendingOrderRunning = new AtomicBoolean(false); /** * 挂单任务,每分钟执行一次 */ @Scheduled(cron = "0 0/1 * * * ?") public void pendingOrderTask() { if (isPendingOrderRunning.get()) { // 判断任务是否在处理中 log.info("挂单定时任务--------->上次任务还未执行完成,本次任务忽略"); return; } if (pendingOrderLock.tryLock()) { try { isPendingOrderRunning.set(true); // 设置处理中标识为true log.info("挂单定时任务--------->开始"); userPendingorderService.orderTask(); log.info("挂单定时任务--------->结束"); } catch (Exception e) { log.error("挂单定时任务发生异常", e); } finally { pendingOrderLock.unlock(); isPendingOrderRunning.set(false); // 设置处理中标识为false } } else { log.info("挂单定时任务--------->上次任务还未执行完成,本次任务忽略"); } } }