|  | @@ -22,16 +22,27 @@ import java.util.concurrent.ConcurrentHashMap;
 | 
	
		
			
				|  |  |  @Component
 | 
	
		
			
				|  |  |  public class AlarmEventListener implements ApplicationListener<AlarmEvent> {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    private static final Map<String, PrintWriter> SSE_CACHE = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +    private static final Map<String, PrintWriter> sseChannelMap = new ConcurrentHashMap<>();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public void addSseEmitter(String browserId, PrintWriter writer) throws InterruptedException {
 | 
	
		
			
				|  |  | +        sseChannelMap.put(browserId, writer);
 | 
	
		
			
				|  |  | +        log.info("[SSE推送] 连接已建立, 浏览器 ID: {}, 当前在线数: {}", browserId, sseChannelMap.size());
 | 
	
		
			
				|  |  | +        while (!writer.checkError()) {
 | 
	
		
			
				|  |  | +            try {
 | 
	
		
			
				|  |  | +                Thread.sleep(1000);
 | 
	
		
			
				|  |  | +            } catch (InterruptedException e) {
 | 
	
		
			
				|  |  | +                throw new RuntimeException(e);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +            writer.write(":keep alive\n\n");
 | 
	
		
			
				|  |  | +            writer.flush();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +        removeSseEmitter(browserId, writer);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    public void addSseEmitter(String browserId, PrintWriter writer) {
 | 
	
		
			
				|  |  | -        SSE_CACHE.put(browserId, writer);
 | 
	
		
			
				|  |  | -        log.info("[SSE推送] 连接已建立, 浏览器 ID: {}, 当前在线数: {}", browserId, SSE_CACHE.size());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public void removeSseEmitter(String browserId, PrintWriter writer) {
 | 
	
		
			
				|  |  | -        SSE_CACHE.remove(browserId, writer);
 | 
	
		
			
				|  |  | -        log.info("[SSE推送] 连接已断开, 浏览器 ID: {}, 当前在线数: {}", browserId, SSE_CACHE.size());
 | 
	
		
			
				|  |  | +        sseChannelMap.remove(browserId, writer);
 | 
	
		
			
				|  |  | +        log.info("[SSE推送] 连接已断开, 浏览器 ID: {}, 当前在线数: {}", browserId, sseChannelMap.size());
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      @Override
 | 
	
	
		
			
				|  | @@ -42,13 +53,7 @@ public class AlarmEventListener implements ApplicationListener<AlarmEvent> {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          log.info("设备报警事件触发, deviceId: {}, {}", event.getAlarmInfo().getDeviceId(), event.getAlarmInfo().getAlarmDescription());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        String msg = "<strong>设备:</strong> <i>" + event.getAlarmInfo().getDeviceId() + "</i>"
 | 
	
		
			
				|  |  | -                + "<br><strong>通道编号:</strong> <i>" + event.getAlarmInfo().getChannelId() + "</i>"
 | 
	
		
			
				|  |  | -                + "<br><strong>报警描述:</strong> <i>" + event.getAlarmInfo().getAlarmDescription() + "</i>"
 | 
	
		
			
				|  |  | -                + "<br><strong>报警时间:</strong> <i>" + event.getAlarmInfo().getAlarmTime() + "</i>";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -        for (Iterator<Map.Entry<String, PrintWriter>> it = SSE_CACHE.entrySet().iterator(); it.hasNext(); ) {
 | 
	
		
			
				|  |  | +        for (Iterator<Map.Entry<String, PrintWriter>> it = sseChannelMap.entrySet().iterator(); it.hasNext(); ) {
 | 
	
		
			
				|  |  |              Map.Entry<String, PrintWriter> response = it.next();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              try {
 | 
	
	
		
			
				|  | @@ -59,12 +64,6 @@ public class AlarmEventListener implements ApplicationListener<AlarmEvent> {
 | 
	
		
			
				|  |  |                      continue;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                String sseMsg = "event:message\n" +
 | 
	
		
			
				|  |  | -                        "data:" + msg + "\n" +
 | 
	
		
			
				|  |  | -                        "\n";
 | 
	
		
			
				|  |  | -                System.out.println(
 | 
	
		
			
				|  |  | -                        SSEMessage.getInstance("message", event.getAlarmInfo()).ecode()
 | 
	
		
			
				|  |  | -                );
 | 
	
		
			
				|  |  |                  writer.write(SSEMessage.getInstance("message", event.getAlarmInfo()).ecode());
 | 
	
		
			
				|  |  |                  writer.flush();
 | 
	
		
			
				|  |  |              } catch (Exception e) {
 |