package com.whyc.webSocket; import com.whyc.config.WebSocketConfig; import com.whyc.dto.Response; import com.whyc.factory.ThreadPoolExecutorFactory; import com.whyc.pojo.db_user.UserInf; import com.whyc.service.BattLithiumTestDataInfService; import com.whyc.service.DevLithiumInfService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.servlet.http.HttpSession; import javax.websocket.*; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * 左侧列表 */ @Component @ServerEndpoint(value = "/devLithiumStatistic",encoders = WebSocketEncoder.class,configurator = WebSocketConfig.class) public class DevLithiumStatisticSocket { private Session session; private Thread thread; private static DevLithiumInfService devLithiumInfService; private static BattLithiumTestDataInfService battLithiumTestDataInfService; private HttpSession httpSession; @Autowired public void setDevLithiumInfService(DevLithiumInfService devLithiumInfService) { DevLithiumStatisticSocket.devLithiumInfService = devLithiumInfService; } @Autowired public void setBattTestDataInfService(BattLithiumTestDataInfService battLithiumTestDataInfService) { DevLithiumStatisticSocket.battLithiumTestDataInfService = battLithiumTestDataInfService; } @OnOpen public void onOpen(Session session, EndpointConfig config){ this.httpSession = (HttpSession) config.getUserProperties().get("httpSession"); UserInf user = (UserInf) this.httpSession.getAttribute("user"); final int userId = user.getUid(); //final int userId = 101; Thread thread = new Thread() { @Override public void run() { try { while (!currentThread().isInterrupted()) { Response res = getStatistics(userId); session.getBasicRemote().sendObject(res); sleep(4000); } } catch (Exception e) { this.interrupt(); } } }; thread.start(); this.thread = thread; } //获取统计信息 private Response getStatistics(int userId) { Map map=new HashMap<>(); try { ThreadPoolExecutor poolExecutor = ThreadPoolExecutorFactory.getPoolExecutor(); CountDownLatch latch = new CountDownLatch(3); //充放电一体机测试统计/锂电均衡仪测试统计 poolExecutor.execute(() -> { Map lithiumTestInfMap = battLithiumTestDataInfService.getDevTinfByYearMonth(userId); map.put("lithiumTestInf",lithiumTestInfMap); latch.countDown(); }); //设备分类总数统计/设备状态统计/地图信息 poolExecutor.execute(() -> { Map devSaticMap=devLithiumInfService.getDevStaticByType(userId); map.put("devLithiumStatistics",devSaticMap); latch.countDown(); }); //近一周电池测试趋势统计(从当前时间开始) poolExecutor.execute(() -> { Map devTestByWeekMap= battLithiumTestDataInfService.getDevTinfByWeek(userId); map.put("devLithiumTestByWeek",devTestByWeekMap); latch.countDown(); }); latch.await(10, TimeUnit.MINUTES); } catch (InterruptedException e) { e.printStackTrace(); } return new Response().setII(1,true,map,""); } @OnClose public void onClose(CloseReason closeReason) throws IOException { System.err.println("closeReason = " + closeReason); if(session.isOpen()){ session.close(); } } @OnError public void onError(Throwable error) throws IOException { error.printStackTrace(); thread.isInterrupted(); if(session.isOpen()){ session.close(); } } }