Untitled
package com.hdfc.epi.service; import lombok.extern.log4j.Log4j2; import org.springframework.stereotype.Service; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.io.IOException; import java.time.LocalDateTime; import java.util.concurrent.ConcurrentHashMap; @Service @Log4j2 public class SseService { final ConcurrentHashMap<String, SseEmitter> map = new ConcurrentHashMap<>(); public SseEmitter handler(String ulId) { if(map.containsKey(ulId)) { return map.get(ulId); } SseEmitter sseEmitter = new SseEmitter(Long.MAX_VALUE); Runnable callback = () -> removeEmitter(ulId); sseEmitter.onCompletion(callback); sseEmitter.onTimeout(callback); sseEmitter.onError(e -> { log.error("Error in emitter {}, -> {}", ulId, e.getMessage()); callback.run(); }); map.put(ulId, sseEmitter); return sseEmitter; } public void publishToEmitter(String ulId) { SseEmitter sseEmitter = map.get(ulId); if(sseEmitter != null) { log.info("Sending event to emitter: {}", ulId); try{ sseEmitter.send(SseEmitter.event().data("Hello at " + LocalDateTime.now())); } catch(IOException e){ log.error("Something went wrong publishing to emitter: {}", e.getMessage()); } } } private void removeEmitter(String ulId) { SseEmitter sseEmitter = map.remove(ulId); if(sseEmitter != null) { sseEmitter.complete(); } } }
Leave a Comment