package com.ruoyi.web.task; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.service.ISysJobService; import com.ruoyi.system.domain.Apply; import com.ruoyi.system.domain.Perform; import com.ruoyi.system.mapper.ApplyMapper; import com.ruoyi.system.mapper.PerformMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.*; import java.util.concurrent.CompletableFuture; /** * 定时任务调度测试 * * @author ruoyi */ @Component("ryTask") public class RyTask { @Autowired private ISysJobService jobService; @Autowired private PerformMapper performMapper; @Autowired private ApplyMapper applyMapper; private static final Logger log = LoggerFactory.getLogger(RyTask.class); /** * 抢票 * * @param pid */ public void rob(Long pid, Long jobId) throws Exception { //status Perform pStatus1 = new Perform(); pStatus1.setStatus("2"); pStatus1.setId(pid); performMapper.updatePerform(pStatus1); //执行完成停止任务 SysJob job = new SysJob(); job.setJobId(jobId); job.setStatus("1"); jobService.changeStatus(job); //演出 Perform perform = performMapper.selectPerformById(pid); if (perform == null) { throw new Exception("未找到演出"); } //URL String url = String.format("https://faneventapi.weverse.io/api/v1/events/%s/register", perform.getNum()); //人员 Apply apply = new Apply(); apply.setPerformId(pid); List applies = applyMapper.selectApplyListAllow(apply); if (applies == null || applies.isEmpty()) { throw new Exception("没有参与人员"); } if (perform.getAgree() == null || "".equals(perform.getAgree())) { throw new Exception("协议为空"); } //协议 String[] agree = perform.getAgree().split(","); int[] agrees = Arrays.stream(agree).mapToInt(Integer::parseInt).toArray(); List req = new ArrayList<>(); for (Apply a : applies) { // 准备JSON负载 Map eventData = new HashMap<>(); eventData.put("eventId", Integer.parseInt(perform.getNum())); eventData.put("language", "zh-cn"); Map data = new HashMap<>(); data.put("birthDate", a.getBirthday()); data.put("phoneNumber", a.getCountryCode() + " " + a.getPhoneNum()); data.put("agreedTermIds", agrees); eventData.put("data", data); ObjectMapper mapper = new ObjectMapper(); String jsonPayload = mapper.writeValueAsString(eventData); System.out.println(jsonPayload); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(url)) .header("Content-Type", "application/json") .header("Authorization", "Bearer " + a.getToken()) .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") .POST(HttpRequest.BodyPublishers.ofString(jsonPayload)) .build(); req.add(new MyReq(client, request, a.getName())); } Calendar calendar = Calendar.getInstance(); calendar.setTime(perform.getStartTime()); calendar.add(Calendar.HOUR_OF_DAY, -1); long start = calendar.getTimeInMillis(); long now = System.currentTimeMillis(); Thread.sleep(start - now); log.info("抢票开始了"); for (MyReq r : req) { log.info("【用户】:"+r.getUser()); // 发起异步请求,但不等待结果 CompletableFuture> future2 = r.getClient().sendAsync(r.getRequest(), HttpResponse.BodyHandlers.ofString()); future2.thenAccept(response -> { // 处理响应(例如,记录日志) System.out.println("Response received: " + response.statusCode()); System.out.println(response.body()); }).exceptionally(ex -> { // 处理异常 ex.printStackTrace(); return null; }); } //status Perform pStatus2 = new Perform(); pStatus2.setStatus("3"); pStatus2.setId(pid); performMapper.updatePerform(pStatus2); } }