package com.whyc.ws; import com.whyc.dto.Response; import com.whyc.pojo.ExperimentPoint; import com.whyc.service.DeviceService; import com.whyc.service.ExperimentService; import io.swagger.annotations.Api; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.Date; import java.util.List; import static java.lang.Thread.sleep; @ServerEndpoint(value = "/experiment/{experimentId}", encoders = WebSocketEncoder.class) @Component @Api(tags = "设备ws") @Slf4j public class ExperimentSocket { private Session session; private volatile Thread thread; private static ExperimentService service; @Autowired public void setService(ExperimentService service) { this.service = service; } /** * 点击开始试验,开启webSocket,传入试验id,更新试验状态 * * @param session * @param experimentId */ @OnOpen public void onOpen(Session session, @PathParam("experimentId") String experimentId) { log.warn("ExperimentSocket会话开启了:{}", session); this.session = session; if (session.isOpen()) { //session.getBasicRemote().sendObject(service.updateStatus(experimentId)); service.updateStatus(experimentId); sendMessage(experimentId); } } @OnMessage public void onMessage(String message) { try { this.sendMessage(message); } catch (Exception e) { e.printStackTrace(); } } /** * 动态返回步骤和执行信息 * @param experimentId */ private void sendMessage(String experimentId) { String type = experimentId.split("_")[0].toLowerCase(); try { //检查步骤1,属于正式实验前的环境稳定性校验 session.getBasicRemote().sendObject(service.checkPreconditionStep1(type)); //正式测试点的数据返回 //1.返回整体试验点 Response pointResponse = service.getPoint(experimentId); List experimentPoints = (List) pointResponse.getData(); experimentPoints.stream().forEach(experimentPoint -> { //启动第一个测试点,返回整体状态 experimentPoint.setStatus(1); experimentPoint.setStartTime(new Date()); service.updatePointStatus(experimentPoint); try { session.getBasicRemote().sendObject(experimentPoints); } catch (IOException | EncodeException e) { e.printStackTrace(); } try { //等待一个测试时间 sleep(experimentPoint.getDuration()); //更新第一个测试点的情况,获取整个时间的情况 } catch (InterruptedException e) { e.printStackTrace(); } }); } catch (IOException | EncodeException e) { e.printStackTrace(); } if(session!=null) { thread = new Thread("Thread_device") { public void run() { while (!thread.isInterrupted()) { if (session.isOpen()) { //session.getBasicRemote().sendObject(service.getStatus()); try { session.getBasicRemote().sendObject("yeah!"); } catch (IOException | EncodeException e) { e.printStackTrace(); } } try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; thread.start(); } } @OnClose public void onClose() { if (thread != null && thread.isAlive()) { thread.interrupt(); } log.warn("webSocket会话关闭了:{}", session); } @OnError public void onError(Throwable error) { error.printStackTrace(); if (thread != null && thread.isAlive()) { thread.interrupt(); } } }