private CircuitBreakerEventEmitter(Flux<CircuitBreakerEventDTO> eventStream) { this.sseEmitter = new SseEmitter(); this.sseEmitter.onCompletion(this::unsubscribe); this.sseEmitter.onTimeout(this::unsubscribe); this.disposable = eventStream.subscribe(this::notify, this.sseEmitter::completeWithError, this.sseEmitter::complete); }
public RateLimiterEventsEmitter(Flux<RateLimiterEventDTO> eventStream) { this.sseEmitter = new SseEmitter(); this.sseEmitter.onCompletion(this::unsubscribe); this.sseEmitter.onTimeout(this::unsubscribe); this.disposable = eventStream.subscribe(this::notify, this.sseEmitter::completeWithError, this.sseEmitter::complete); }
@RequestMapping(value = "/temperature-stream", method = RequestMethod.GET) public SseEmitter events(HttpServletRequest request) { log.info("SSE stream opened for client: " + request.getRemoteAddr()); SseEmitter emitter = new SseEmitter(SSE_SESSION_TIMEOUT); clients.add(emitter); // Remove SseEmitter from active clients on error or client disconnect emitter.onTimeout(() -> clients.remove(emitter)); emitter.onCompletion(() -> clients.remove(emitter)); return emitter; }
private SseEmitter emit(Route route, Message<Collection<Object>> message) throws IOException { SseEmitter emitter = new SseEmitter(Long.MAX_VALUE); String path = route.getPath(); if (!emitters.containsKey(path)) { emitters.putIfAbsent(path, new HashSet<>()); } emitters.get(path).add(emitter); emitter.onCompletion(() -> emitters.get(path).remove(emitter)); emitter.onTimeout(() -> emitters.get(path).remove(emitter)); for (Object body : message.getPayload()) { emitter.send(body); } return emitter; }
@GetMapping("/kafka-messages") public SseEmitter getKafkaMessages() { SseEmitter emitter = new SseEmitter( 1 * 60 * 1000L ); emitters.add(emitter); emitter.onCompletion(new Runnable() { @Override public void run() { emitters.remove(emitter); } }); emitter.onTimeout(new Runnable() { @Override public void run() { emitters.remove(emitter); } }); return emitter; }
/** * Creates a {@link SseEmitter} and registers the client in the internal database. * Client will be subscribed to the provided events if specified. * @param clientId unique client identifier * @param timeout timeout value in milliseconds * @param unsubscribe if true unsubscribes from all events that are not provided with * the next parameter * @param events events the client wants to subscribe * @return a new SseEmitter instance */ public SseEmitter createSseEmitter(String clientId, Long timeout, boolean unsubscribe, boolean completeAfterMessage, String... events) { SseEmitter emitter = new SseEmitter(timeout); emitter.onTimeout(emitter::complete); registerClient(clientId, emitter, completeAfterMessage); if (events != null && events.length > 0) { if (unsubscribe) { unsubscribeFromAllEvents(clientId, events); } for (String event : events) { subscribe(clientId, event); } } return emitter; }