package com.genersoft.iot.vmp.gb28181.event.alarm;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 报警事件监听器.
*
* @author lawrencehj
* @author xiaoQQya
* @since 2021/01/20
*/
@Component
public class AlarmEventListener implements ApplicationListener {
private static final Logger logger = LoggerFactory.getLogger(AlarmEventListener.class);
private static final Map SSE_CACHE = new ConcurrentHashMap<>();
public void addSseEmitter(String browserId, PrintWriter writer) {
SSE_CACHE.put(browserId, writer);
logger.info("SSE 在线数量: {}", SSE_CACHE.size());
}
public void removeSseEmitter(String browserId, PrintWriter writer) {
SSE_CACHE.remove(browserId, writer);
logger.info("SSE 在线数量: {}", SSE_CACHE.size());
}
@Override
public void onApplicationEvent(@NotNull AlarmEvent event) {
if (logger.isDebugEnabled()) {
logger.debug("设备报警事件触发, deviceId: {}, {}", event.getAlarmInfo().getDeviceId(), event.getAlarmInfo().getAlarmDescription());
}
String msg = "设备编号: " + event.getAlarmInfo().getDeviceId() + ""
+ "
通道编号: " + event.getAlarmInfo().getChannelId() + ""
+ "
报警描述: " + event.getAlarmInfo().getAlarmDescription() + ""
+ "
报警时间: " + event.getAlarmInfo().getAlarmTime() + "";
for (Iterator> it = SSE_CACHE.entrySet().iterator(); it.hasNext(); ) {
Map.Entry response = it.next();
logger.info("推送到 SSE 连接, 浏览器 ID: {}", response.getKey());
try {
PrintWriter writer = response.getValue();
if (writer.checkError()) {
it.remove();
continue;
}
String sseMsg = "event:message\n" +
"data:" + msg + "\n" +
"\n";
writer.write(sseMsg);
writer.flush();
} catch (Exception e) {
it.remove();
}
}
}
}