SSEService.java 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package com.smcic.api.conference.service.impl;
  2. import com.smcic.core.advice.APIException;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.stereotype.Service;
  5. import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
  6. import java.io.IOException;
  7. import java.util.Map;
  8. import java.util.concurrent.ConcurrentHashMap;
  9. @Service
  10. @Slf4j
  11. public class SSEService {
  12. private Map<Long, Map<String,SseEmitter>> sseDataMap = new ConcurrentHashMap<>();
  13. public void monitor(Long cid, String uuid, SseEmitter sseEmitter) {
  14. if(!sseDataMap.containsKey(cid)){
  15. sseDataMap.put(cid, new ConcurrentHashMap<>());
  16. }
  17. sseDataMap.get(cid).put(uuid,sseEmitter);
  18. }
  19. public void sendData(Long cid, Object data) {
  20. try {
  21. if (sseDataMap != null && sseDataMap.containsKey(cid)) {
  22. Map<String, SseEmitter> stringSseEmitterMap = sseDataMap.get(cid);
  23. for (String uuid : stringSseEmitterMap.keySet()){
  24. stringSseEmitterMap.get(uuid).send(SseEmitter.event().name("data").data(data));
  25. }
  26. }
  27. }catch (IOException e){
  28. log.error("发送数据失败",e);
  29. }
  30. }
  31. public void complate(Long cid, String uuid) {
  32. if (sseDataMap.containsKey(cid) && sseDataMap.get(cid).containsKey(uuid)) {
  33. Map<String, SseEmitter> stringSseEmitterMap = sseDataMap.get(cid);
  34. SseEmitter sseEmitter = stringSseEmitterMap.get(uuid);
  35. sseEmitter.complete();
  36. log.info("关闭连接");
  37. stringSseEmitterMap.remove(uuid);
  38. if(stringSseEmitterMap.isEmpty()){
  39. sseDataMap.remove(cid);
  40. }
  41. }
  42. }
  43. }