feat:持久化任务

This commit is contained in:
xiang
2025-07-27 23:16:14 +08:00
parent 162e7191ea
commit fbecd0a03a
5 changed files with 40 additions and 5 deletions

View File

@@ -1,5 +1,6 @@
package com.xiang;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -10,6 +11,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
*/
@SpringBootApplication
@EnableScheduling
@MapperScan("com.xiang.xservice.fwd.mapper")
public class ServiceScriptApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceScriptApplication.class, args);

View File

@@ -9,4 +9,5 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public class FwdOrderTaskParam {
private Long projectId;
private Long taskId;
}

View File

@@ -2,6 +2,7 @@ package com.xiang.xservice.fwd.schedule;
import com.alibaba.fastjson2.JSONObject;
import com.xiang.xservice.basic.utils.DateUtils;
import com.xiang.xservice.basic.utils.PrimaryKeyUtils;
import com.xiang.xservice.basic.xservice.dingTalk.service.DingTalkService;
import com.xiang.xservice.fwd.entity.param.FwdOrderTaskParam;
import com.xiang.xservice.fwd.entity.pojo.FPerformConfig;
@@ -12,7 +13,11 @@ import com.xiang.xservice.fwd.mapper.FwdPerformProjectInfoMapper;
import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper;
import com.xiang.xservice.fwd.service.IPerformService;
import com.xiang.xservice.schedule.core.DynamicTaskScheduler;
import com.xiang.xservice.schedule.entity.ScheduledTaskEntity;
import com.xiang.xservice.schedule.entity.TaskConfig;
import com.xiang.xservice.schedule.enums.TaskGroupEnum;
import com.xiang.xservice.schedule.enums.TaskStatusEnum;
import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -23,6 +28,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
@@ -43,6 +49,7 @@ public class FwdImportantMsgJob {
private final FwdUserConfigMapper fwdUserConfigMapper;
private final FwdAudienceConfigMapper fwdAudienceConfigMapper;
private final IPerformService iPerformService;
private final IDynamicTaskSchedulerService dynamicTaskSchedulerService;
@Value("${DingTalk.chatId}")
private String chatId;
@@ -77,12 +84,29 @@ public class FwdImportantMsgJob {
StringBuilder msg = new StringBuilder("今日" + now + "演唱会门票预售信息:\n");
for (FPerformProjectInfo data : saleTodayData) {
msg.append("演唱会名称:").append(data.getProjectName()).append("预售时间:").append(DateUtils.getDateTimeStr(data.getPreSaleTime())).append("\n");
long taskId = PrimaryKeyUtils.snowflakeId();
dynamicTaskScheduler.schedule(
new TaskConfig(System.currentTimeMillis(), data.getProjectName(), data.getPreSaleTime()),
new TicketGrabTask(fwdUserConfigMapper, fwdAudienceConfigMapper, iPerformService, new FwdOrderTaskParam(data.getProjectId())));
new TaskConfig(taskId, "芬玩岛演唱会抢票-【" + data.getProjectName() + "", TaskGroupEnum.SERVICE_FWD_SCHEDULE.getCode(),
data.getPreSaleTime(), null),
new TicketGrabTask(fwdUserConfigMapper, fwdAudienceConfigMapper, iPerformService,
new FwdOrderTaskParam(data.getProjectId(), taskId), dynamicTaskSchedulerService));
savaTask(data, taskId);
}
msg.append("请注意进行数据库配置的更改!");
dingTalkService.sendChatMessage(chatId, msg.toString());
log.info("【芬玩岛】演唱会预售定时任务结束time:{}", System.currentTimeMillis());
}
private void savaTask(FPerformProjectInfo data, long taskId) {
ScheduledTaskEntity entity = new ScheduledTaskEntity();
entity.setId(taskId);
entity.setTaskName("芬玩岛演唱会抢票-【" + data.getProjectName() + "");
entity.setTaskGroup(TaskGroupEnum.SERVICE_FWD_SCHEDULE.getCode());
entity.setRunTime(data.getPreSaleTime());
entity.setStatus(TaskStatusEnum.UN_START.getCode());
entity.setParameters(null);
entity.setCreatedTime(LocalDateTime.now());
entity.setUpdatedTime(LocalDateTime.now());
dynamicTaskSchedulerService.saveTask(entity);
}
}

View File

@@ -7,6 +7,7 @@ import com.xiang.xservice.fwd.entity.pojo.FUserConfig;
import com.xiang.xservice.fwd.mapper.FwdAudienceConfigMapper;
import com.xiang.xservice.fwd.mapper.FwdUserConfigMapper;
import com.xiang.xservice.fwd.service.IPerformService;
import com.xiang.xservice.schedule.service.IDynamicTaskSchedulerService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@@ -20,17 +21,22 @@ public class TicketGrabTask implements Runnable {
private final FwdAudienceConfigMapper audienceConfigMapper;
private final IPerformService performService;
private final FwdOrderTaskParam param;
private final IDynamicTaskSchedulerService dynamicTaskSchedulerService;
public TicketGrabTask(FwdUserConfigMapper userConfigMapper, FwdAudienceConfigMapper audienceConfigMapper, IPerformService performService, FwdOrderTaskParam param) {
public TicketGrabTask(FwdUserConfigMapper userConfigMapper, FwdAudienceConfigMapper audienceConfigMapper,
IPerformService performService, FwdOrderTaskParam param,
IDynamicTaskSchedulerService dynamicTaskSchedulerService) {
this.userConfigMapper = userConfigMapper;
this.audienceConfigMapper = audienceConfigMapper;
this.performService = performService;
this.param = param;
this.dynamicTaskSchedulerService = dynamicTaskSchedulerService;
}
@Override
public void run() {
log.info("【TicketGrabTask】 run start. 获取到参数:{}", JSON.toJSONString(param));
dynamicTaskSchedulerService.updateProcess(param.getTaskId());
List<FUserConfig> availableUser = userConfigMapper.getAvailableUser();
if (CollectionUtils.isEmpty(availableUser)) {
return;
@@ -38,7 +44,9 @@ public class TicketGrabTask implements Runnable {
for (FUserConfig userConfig : availableUser) {
List<FAudienceConfig> audiences = audienceConfigMapper.getAudienceByUserId(userConfig.getId());
try {
performService.createProjectOrder(param.getProjectId(), audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList()));
if (performService.createProjectOrder(param.getProjectId(), audiences.stream().map(FAudienceConfig::getFrequentId).collect(Collectors.toList()))) {
dynamicTaskSchedulerService.finishTask(param.getTaskId());
}
} catch (Exception e) {
log.error("创建订单失败", e);
}