Untitled

 avatar
unknown
plain_text
2 months ago
1.9 kB
4
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