package com.ots.project.exam.service.impl; import com.alibaba.fastjson.JSON; import com.ots.project.exam.service.ReportCalculationServices; import com.ots.project.tool.report.reportCalculation.response.ReportAPIResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; import java.util.Objects; @Service @Slf4j public class ReportCalculationServicesImpl implements ReportCalculationServices { private Socket socket; private PrintWriter socketOut; private BufferedReader socketIn; @Value("${ATSTai.port}") private int port; @Value("${ATSTai.host}") private String host; @PostConstruct private void init() { try { socket = new Socket(host, port); socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); socketOut = new PrintWriter(socket.getOutputStream()); } catch (Exception ex) { log.error("调用泰国团队组件连接失败:{}",ex.getMessage(),ex); } } @PreDestroy private void destory() { if (Objects.nonNull(socketIn)) { try { socketIn.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } if (Objects.nonNull(socketOut)) { socketOut.close(); } if (Objects.nonNull(socket)) { try { socket.close(); } catch (IOException ioe) { ioe.printStackTrace(); } } } public Boolean isServerClose(Socket socket){ try{ socket.sendUrgentData(0xFF); return false; }catch(Exception se){ return true; } } @Override public ReportAPIResult stageCalculation(Object request) { if (isServerClose(socket)) { destory(); init(); } ReportAPIResult reportAPIResult = new ReportAPIResult(); try { reportAPIResult = getReportAPIResult(request); }catch (Exception ex) { log.error("调用泰国团队组件断开:尝试重连......"); destory(); init(); try { reportAPIResult = getReportAPIResult(request); } catch (IOException e) { e.printStackTrace(); reportAPIResult.setCode("111"); reportAPIResult.setMessage("调用泰国团队组件异常:" + ex.getMessage()); } } return reportAPIResult; } private ReportAPIResult getReportAPIResult(Object request) throws IOException { ReportAPIResult reportAPIResult; socketOut.println(JSON.toJSONString(request)); socketOut.flush(); String inTemp = socketIn.readLine(); reportAPIResult = JSON.parseObject(inTemp, ReportAPIResult.class); return reportAPIResult; } }