Untitled
unknown
plain_text
9 months ago
1.6 kB
3
Indexable
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();
}
}
}
Editor is loading...
Leave a Comment