|  |  | @ -7,6 +7,7 @@ import org.springframework.stereotype.Component; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | import javax.websocket.*; |  |  |  | import javax.websocket.*; | 
			
		
	
		
		
			
				
					
					|  |  |  | import javax.websocket.server.ServerEndpoint; |  |  |  | import javax.websocket.server.ServerEndpoint; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | import java.nio.ByteBuffer; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.CopyOnWriteArraySet; |  |  |  | import java.util.concurrent.CopyOnWriteArraySet; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.Executors; |  |  |  | import java.util.concurrent.Executors; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.concurrent.ScheduledExecutorService; |  |  |  | import java.util.concurrent.ScheduledExecutorService; | 
			
		
	
	
		
		
			
				
					|  |  | @ -20,8 +21,10 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static ISimulationService simulationService; |  |  |  |     private static ISimulationService simulationService; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); |  |  |  |     private  ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     private boolean isSimulationRunning = false; |  |  |  |     private volatile boolean isSimulationRunning = false; | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private ScheduledExecutorService heartbeatScheduler = Executors.newScheduledThreadPool(1); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     @Autowired |  |  |  |     @Autowired | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void setService(ISimulationService simulationService) { |  |  |  |     public void setService(ISimulationService simulationService) { | 
			
		
	
	
		
		
			
				
					|  |  | @ -36,6 +39,10 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void OnOpen(Session session) { |  |  |  |     public void OnOpen(Session session) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         this.session = session; |  |  |  |         this.session = session; | 
			
		
	
		
		
			
				
					
					|  |  |  |         webSocketSet.add(this); |  |  |  |         webSocketSet.add(this); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if(!heartbeatScheduler.isShutdown()){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             heartbeatScheduler = Executors.newScheduledThreadPool(1); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         startHeartbeat(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size()); |  |  |  |         log.info("【websocket消息】有新的连接, 总数:{}", webSocketSet.size()); | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -46,6 +53,9 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  |             //发送开始仿真的信息
 |  |  |  |             //发送开始仿真的信息
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             String result = simulationService.getPlantData(message); |  |  |  |             String result = simulationService.getPlantData(message); | 
			
		
	
		
		
			
				
					
					|  |  |  |             if ("Simulation Started".equals(result)) { |  |  |  |             if ("Simulation Started".equals(result)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if(scheduler.isShutdown()){ | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     scheduler = Executors.newScheduledThreadPool(1); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                 if (!isSimulationRunning) { |  |  |  |                 if (!isSimulationRunning) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                     isSimulationRunning = true; |  |  |  |                     isSimulationRunning = true; | 
			
		
	
		
		
			
				
					
					|  |  |  |                     log.info("【仿真开始】"); |  |  |  |                     log.info("【仿真开始】"); | 
			
		
	
	
		
		
			
				
					|  |  | @ -59,10 +69,12 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 if ("1".equals(data) || "1.00".equals(data)) { |  |  |  |                                 if ("1".equals(data) || "1.00".equals(data)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                                     sendMessage("ending"); |  |  |  |                                     sendMessage("ending"); | 
			
		
	
		
		
			
				
					
					|  |  |  |                                     isSimulationRunning = false; |  |  |  |                                     isSimulationRunning = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                                     scheduler.shutdown(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                                 } |  |  |  |                                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |                             } |  |  |  |                             } | 
			
		
	
		
		
			
				
					
					|  |  |  |                         } catch (Exception e) { |  |  |  |                         } catch (Exception e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |                             isSimulationRunning = false; |  |  |  |                             isSimulationRunning = false; | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                             scheduler.shutdown(); | 
			
		
	
		
		
			
				
					
					|  |  |  |                         } |  |  |  |                         } | 
			
		
	
		
		
			
				
					
					|  |  |  |                     }, 0, 10, TimeUnit.SECONDS); |  |  |  |                     }, 0, 10, TimeUnit.SECONDS); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 } |  |  |  |                 } | 
			
		
	
	
		
		
			
				
					|  |  | @ -84,7 +96,9 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  |     @OnClose |  |  |  |     @OnClose | 
			
		
	
		
		
			
				
					
					|  |  |  |     public void onClose() { |  |  |  |     public void onClose() { | 
			
		
	
		
		
			
				
					
					|  |  |  |         webSocketSet.remove(this); |  |  |  |         webSocketSet.remove(this); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         stopHeartbeat(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size()); |  |  |  |         log.info("【websocket消息】连接断开, 总数:{}", webSocketSet.size()); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -101,4 +115,27 @@ public class SimulationWebsocket { | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |     } |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private void startHeartbeat() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         heartbeatScheduler.scheduleAtFixedRate(() -> { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             try { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 if (session.isOpen()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                     sendMessage("ping"); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } catch (Exception e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 log.error("【websocket心跳】发送心跳失败", e); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         }, 0, 10, TimeUnit.SECONDS); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     private void stopHeartbeat() { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         heartbeatScheduler.shutdown(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         try { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             if (!heartbeatScheduler.awaitTermination(5, TimeUnit.SECONDS)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |                 heartbeatScheduler.shutdownNow(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } catch (InterruptedException e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |             heartbeatScheduler.shutdownNow(); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     } | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |