Untitled

 avatar
unknown
plain_text
20 days ago
1.6 kB
1
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();
        }
    }
}
Leave a Comment