Untitled
unknown
plain_text
9 months ago
1.9 kB
5
Indexable
package com.hdfc.epi.lib.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
@Slf4j
@Service
public class SSEService {
private final ConcurrentHashMap<String, SseEmitter> map = new ConcurrentHashMap<>();
public SseEmitter handler(String ulId) {
return map.computeIfAbsent(ulId, id -> {
SseEmitter sseEmitter = new SseEmitter(Long.MAX_VALUE);
sseEmitter.onCompletion(() -> removeEmitter(id));
sseEmitter.onTimeout(() -> removeEmitter(id));
sseEmitter.onError(e -> {
log.error("Error in emitter {} -> {}", id, e.getMessage());
removeEmitter(id);
});
log.info("Created new SSE emitter for {}", id);
return sseEmitter;
});
}
public void publishToEmitter(String ulId, String response) {
SseEmitter sseEmitter = map.get(ulId);
if (sseEmitter != null) {
log.info("Sending event to emitter: {}", ulId);
try {
sseEmitter.send(SseEmitter.event().data(response));
log.info("Successfully published data to emitter {}: {}", ulId, response);
} catch (IOException e) {
log.error("Failed to send event to emitter {}: {}", ulId, e.getMessage());
} finally {
removeEmitter(ulId);
}
} else {
log.warn("Emitter not found for {}", ulId);
}
}
private void removeEmitter(String ulId) {
SseEmitter sseEmitter = map.remove(ulId);
if (sseEmitter != null) {
sseEmitter.complete();
log.info("Emitter {} removed", ulId);
}
}
}
Editor is loading...
Leave a Comment