package com.telpo.dipperposition.service.impl; import com.telpo.dipperposition.common.HexConvert; import com.telpo.dipperposition.common.RedisUtil; import com.telpo.dipperposition.common.SocketClient; import com.telpo.dipperposition.config.SchedulingExecutorConfig; import com.telpo.dipperposition.service.IDipperDataAsyncTaskService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import static java.lang.Thread.sleep; /** * @program: DipperDataAsyncTaskServiceImpl * @description: 获取星历数据。 * @author: king * @create: 2021-01-10 14:01 */ @Service @Slf4j public class DipperDataAsyncTaskServiceImpl implements IDipperDataAsyncTaskService { private static String DIPPER_DATA_KEY = "TaidouDipperData"; private static String DIPPER_ALL_DATA_REQ = "616C6C"; @Autowired private RedisUtil redisUtil; @Autowired private SchedulingExecutorConfig schedulingExecutorConfig; @Override @Async("asyncServiceExecutor") public void pullAstEPH(int tryTimes) throws InterruptedException { tryTimes--; // (1) 发送bds获取星历数据 byte[] dipperData = pullEPHFromDipper(); // (2) 获取星历数据 if (dipperData == null) { log.error("获取星历数据错误,取不到星历数据。"); if (tryTimes>0) { log.info("等待10秒再获取1次。"); sleep(10000); pullAstEPH(tryTimes); } } else { // 保存到DB或者缓存 log.info("保存到DB或者缓存"); redisUtil.set(DIPPER_DATA_KEY,dipperData); } } private byte[] pullEPHFromDipper() { // 创建Socket客户端实例; String serverAddr = schedulingExecutorConfig.getAstServer(); int serverPort = schedulingExecutorConfig.getAstEphAstHexPort(); SocketClient client = new SocketClient(serverAddr,serverPort,schedulingExecutorConfig.getAstTimeout()); // astTimeCmd 组装 String astTimeCmd = DIPPER_ALL_DATA_REQ; String checkSum = HexConvert.makeChecksum(astTimeCmd.toString()).toUpperCase(); StringBuilder astCheckSumBuf = new StringBuilder(); astCheckSumBuf.append(checkSum); while (astCheckSumBuf.length()<4) { astCheckSumBuf.insert(0,"0"); } checkSum = astCheckSumBuf.toString(); String hexIn = astTimeCmd + checkSum.substring(0,2) + " " + checkSum.substring(2,4); byte[] sendResult = null; //String ackAckCheckRef = "233E010102000421293C"; sendResult = client.sendCmd(hexIn); client.closeConnection(); return sendResult; } @Override public byte[] getAstEPH(){ // String dipperData = pullEPHFromDipper(); byte[] dipperData; if (!redisUtil.hasKey(DIPPER_DATA_KEY)) { try { this.pullAstEPH(1); } catch (InterruptedException e) { log.error("获取星历数据发生异常:", e); } } dipperData = (byte[])redisUtil.get(DIPPER_DATA_KEY); return dipperData; } }