fxkh-txl-service/src/main/java/com/whdc/component/AutoCallTaskScheduled.java

173 lines
6.5 KiB
Java
Raw Normal View History

2025-07-14 11:23:11 +08:00
package com.whdc.component;
2025-08-08 13:51:52 +08:00
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
2025-07-14 11:23:11 +08:00
import com.whdc.mapper.AutoCallConfigMapper;
2025-08-07 21:29:50 +08:00
import com.whdc.mapper.AutoCallPersonMapper;
2025-07-14 11:23:11 +08:00
import com.whdc.model.entity.AutoCallPerson;
2025-08-08 13:51:52 +08:00
import com.whdc.model.entity.AutoCallTask;
2025-07-14 11:23:11 +08:00
import com.whdc.service.AutoCallTaskService2;
import com.whdc.utils.AutoCallHelper;
2025-08-08 13:51:52 +08:00
import lombok.AllArgsConstructor;
2025-07-14 11:23:11 +08:00
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.annotation.Profile;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
2025-08-08 13:51:52 +08:00
import javax.annotation.PreDestroy;
2025-07-14 11:23:11 +08:00
import java.util.List;
2025-08-08 13:51:52 +08:00
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
2025-07-14 11:23:11 +08:00
import java.util.concurrent.atomic.AtomicBoolean;
/**
* @author lyf
* @since 2025-06-20
*/
@Component
@Slf4j
2025-08-06 17:21:07 +08:00
@Profile({"dev"})
2025-07-14 11:23:11 +08:00
public class AutoCallTaskScheduled {
@Autowired
private AutoCallTaskService2 autoCallTaskService;
@Autowired
2025-08-07 21:29:50 +08:00
private AutoCallPersonMapper personMapper;
@Autowired
2025-07-14 11:23:11 +08:00
private AutoCallConfigMapper configMapper;
@Autowired
private AutoCallHelper autoCallHelper;
2025-08-08 13:51:52 +08:00
private final AtomicBoolean initialized = new AtomicBoolean(false);
private final ExecutorService executorService = Executors.newCachedThreadPool();
2025-07-14 11:23:11 +08:00
@EventListener(ApplicationReadyEvent.class)
public void initialize() throws Exception {
autoCallHelper.getToken();
initialized.set(true);
log.info("AutoCallTaskScheduled初始化完成");
}
@Scheduled(cron = "*/3 * * * * ?")
2025-08-08 13:51:52 +08:00
public void generateTaskLoop() {
2025-07-14 11:23:11 +08:00
if (configMapper.isScheduled()) {
autoCallTaskService.step1GenerateTask();
}
}
2025-08-08 13:51:52 +08:00
private static final AtomicBoolean isSubmitting = new AtomicBoolean(false);
2025-07-14 11:23:11 +08:00
@Scheduled(cron = "*/3 * * * * ?")
2025-08-08 13:51:52 +08:00
public void submitTaskLoop() {
if (!isSubmitting.compareAndSet(false, true)) {
2025-07-14 11:23:11 +08:00
return;
}
try {
2025-08-08 13:51:52 +08:00
if (!initialized.get()) {
return;
}
if (!configMapper.isScheduled()) {
return;
}
try {
List<AutoCallTask> tasks = autoCallTaskService.getTaskMapper().selectList(
new QueryWrapper<AutoCallTask>().eq("status", AutoCallTask.STATUS_GENERATED_AKA_READY_TO_UPLOAD).ne("submit", 1)
);
for (AutoCallTask task : tasks) {
executorService.submit(new AutoCallTaskThread(task.getId(), autoCallTaskService));
log.info("提交任务 taskId={}", task.getId());
task.setSubmit(1);
autoCallTaskService.getTaskMapper().updateById(task);
2025-08-06 17:21:07 +08:00
}
2025-08-08 13:51:52 +08:00
} catch (Exception e) {
log.error("提交任务时发生异常", e);
}
} finally {
isSubmitting.set(false);
}
}
@PreDestroy
public void destroy() {
log.info("正在关闭AutoCallTaskScheduled线程池...");
executorService.shutdown();
try {
if (!executorService.awaitTermination(60, java.util.concurrent.TimeUnit.SECONDS)) {
executorService.shutdownNow();
}
} catch (InterruptedException e) {
executorService.shutdownNow();
Thread.currentThread().interrupt();
}
log.info("AutoCallTaskScheduled线程池已关闭");
}
@AllArgsConstructor
@Slf4j
private static class AutoCallTaskThread implements Runnable {
private Integer taskId;
private AutoCallTaskService2 autoCallTaskService;
2025-07-14 11:23:11 +08:00
2025-08-08 13:51:52 +08:00
@Override
public void run() {
try {
List<AutoCallPerson> personList = autoCallTaskService.getPersonMapper().selectList(
new QueryWrapper<AutoCallPerson>().eq("task_id", taskId).orderByAsc("level")
);
if (personList == null || personList.isEmpty()) {
log.warn("任务没有责任人 taskId={}", taskId);
return;
2025-07-14 11:23:11 +08:00
}
2025-08-08 13:51:52 +08:00
for (AutoCallPerson person : personList) {
//任务可以并发了,但是人员没能前一通挂掉后再重呼
while (person.getUploadedTimes() < 2) {
if (AutoCallPerson.TAG_DONE.equals(person.getTag())) break;
//do upload
autoCallTaskService.step3UploadAICCTask(person);
//fetch status
int pendingDuration = 60 * 1000 * 2;
int loopGap = 1000;
boolean success = false;
while (pendingDuration > 0) {
try {
Thread.sleep(loopGap);
} catch (InterruptedException ignore) {
Thread.currentThread().interrupt();
break;
}
pendingDuration -= loopGap;
2025-07-14 11:23:11 +08:00
2025-08-08 13:51:52 +08:00
success = autoCallTaskService.step4QueryAICCTaskResult(person);
if (success) break;
}
AutoCallPerson _person = autoCallTaskService.getPersonMapper().selectById(person.getId());
person = _person;
if (!success) {
if (person.getUploadedTimes() == 2) {
autoCallTaskService.markPersonDetailQueryTimeout(person);
}
}
//重呼等15秒
if (AutoCallPerson.TAG_DONE.equals(person.getTag())) break;
try {
Thread.sleep(15*1000);
} catch (InterruptedException ignore) {
Thread.currentThread().interrupt();
break;
}
}
if (!AutoCallPerson.TAG_DONE.equals(person.getTag())) {
autoCallTaskService.cancelPerson(person);
2025-08-07 21:29:50 +08:00
}
2025-07-14 11:23:11 +08:00
}
2025-08-08 13:51:52 +08:00
} catch (Exception e) {
log.error("处理任务时发生异常 taskId={}", taskId, e);
2025-07-14 11:23:11 +08:00
}
}
}
}