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); }
/** * Send the object formatted as a single SSE "data" line. It's equivalent to: * <pre> * // static import of SseEmitter.* * * SseEmitter emitter = new SseEmitter(); * emitter.send(event().data(myObject)); * </pre> * * <p>Please, see {@link ResponseBodyEmitter#send(Object) parent Javadoc} * for important notes on exception handling. * * @param object the object to write * @throws IOException raised when an I/O error occurs * @throws java.lang.IllegalStateException wraps any other errors */ @Override public void send(Object object) throws IOException { send(object, null); }
/** * Send the object formatted as a single SSE "data" line. It's equivalent to: * <pre> * // static import of SseEmitter.* * * SseEmitter emitter = new SseEmitter(); * emitter.send(event().data(myObject, MediaType.APPLICATION_JSON)); * </pre> * * <p>Please, see {@link ResponseBodyEmitter#send(Object) parent Javadoc} * for important notes on exception handling. * * @param object the object to write * @param mediaType a MediaType hint for selecting an HttpMessageConverter * @throws IOException raised when an I/O error occurs */ @Override public void send(Object object, @Nullable MediaType mediaType) throws IOException { send(event().data(object, mediaType)); }
@Before public void setup() throws IOException { this.handler = new TestHandler(); this.emitter = new SseEmitter(); this.emitter.initialize(this.handler); }
@RequestMapping(value = "/getNotificationCount/{userId}",method = RequestMethod.GET) public SseEmitter getNotificationCount(@PathVariable("userId") String userId, HttpServletResponse response){ SseEmitter emitter = null; try { emitter = new SseEmitter(); while(true) { try{ int count= myService.getNotificationCount(Integer.parseInt(userId)); emitter.send(count); Thread.sleep(30 * // minutes to sleep 60 * // seconds to a minute 1000); // milliseconds to a second }catch(ClientAbortException cae){ LOGGER.info("ClientAbortException Breaking the notification stream"); break; } } //Closes the stream emitter.complete(); } catch (Exception e) { //Closes the stream emitter.complete(); } return emitter; }
ServerSentEvent.class.isAssignableFrom(elementClass)) { logExecutorWarning(returnType); SseEmitter emitter = new SseEmitter(STREAMING_TIMEOUT_VALUE); new SseEmitterSubscriber(emitter, this.taskExecutor).connect(adapter, returnValue); return emitter;
@RequestMapping(value = BASE_PATH + "/getAccountBalances", method = RequestMethod.GET) public SseEmitter getAccountBalances(@QueryParam("accountId") Integer[] accountIds) { final SseEmitter emitter = new SseEmitter(); new Thread(new Runnable() { @Override public void run() { try { for (int xx = 0; xx < ids.length; xx++) { Thread.sleep(2000L + rand.nextInt(2000)); BalanceDetails balance = new BalanceDetails(); ... emitter.send(emitter.event().name("accountBalance").id(String.valueOf(accountIds[xx])) .data(balance, MediaType.APPLICATION_JSON)); } emitter.send(SseEmitter.event().name("complete").data("complete")); emitter.complete(); } catch (Exception ee) { ee.printStackTrace(); emitter.completeWithError(ee); } } }).start(); return emitter; }
@RequestMapping(path = "/test") public SseEmitter getJournalEvents() { final SseEmitter emitter = new SseEmitter(); try { emitter.send("This commits the response and now let the request timeout to see the exception."); } catch (IOException ex) { LOGGER.debug("error sending event", ex); } 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; }
@Test public void sseEmitter() throws Exception { MethodParameter type = on(TestController.class).resolveReturnType(SseEmitter.class); SseEmitter emitter = new SseEmitter(); this.handler.handleReturnValue(emitter, type, this.mavContainer, this.webRequest); assertTrue(this.request.isAsyncStarted()); assertEquals(200, this.response.getStatus()); assertEquals("text/event-stream;charset=UTF-8", this.response.getContentType()); SimpleBean bean1 = new SimpleBean(); bean1.setId(1L); bean1.setName("Joe"); SimpleBean bean2 = new SimpleBean(); bean2.setId(2L); bean2.setName("John"); emitter.send(SseEmitter.event(). comment("a test").name("update").id("1").reconnectTime(5000L).data(bean1).data(bean2)); assertEquals(":a test\n" + "event:update\n" + "id:1\n" + "retry:5000\n" + "data:{\"id\":1,\"name\":\"Joe\"}\n" + "data:{\"id\":2,\"name\":\"John\"}\n" + "\n", this.response.getContentAsString()); }
@RequestMapping(produces = "text/event-stream") public SseEmitter getJournalEvents() { final SseEmitter emitter = new SseEmitter(); emitter.onCompletion(new Runnable() { @Override public void run() { emitters.remove(emitter); } }); emitters.add(emitter); return emitter; }
@Scheduled(fixedRate = 1000) void timerHandler() { try { emitter.send(new Message(new Date().toString()), MediaType.APPLICATION_JSON); } catch (Exception e) { emitter.completeWithError(e); } } }
/** * 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; }
@RequestMapping("/whatever") public SseEmitter index( SseEmitter emitter = new SseEmitter(); Publisher<String> responsePublisher = someResponseGenerator.getPublisher(); Observable<String> responseObservable = RxReactiveStreams.toObservable(responsePublisher); responseObservable.subscribe( str -> { try { emitter.send(str); } catch (IOException ex) { emitter.completeWithError(ex); } }, error -> { emitter.completeWithError(error); }, emitter::complete ); return emitter; };
private SseEmitter.SseEventBuilder adapt(ServerSentEvent<?> sse) { SseEmitter.SseEventBuilder builder = SseEmitter.event(); String id = sse.id(); String event = sse.event(); Duration retry = sse.retry(); String comment = sse.comment(); Object data = sse.data(); if (id != null) { builder.id(id); } if (event != null) { builder.name(event); } if (data != null) { builder.data(data); } if (retry != null) { builder.reconnectTime(retry.toMillis()); } if (comment != null) { builder.comment(comment); } return builder; } }
sseEmitter.initialize(handler); exec(run, 2); circuitBreaker.reset(); sseEmitter.complete(); assert handler.isCompleted;
SseEmitter sseEmitter = new SseEmitter(); if(calledImei) { try { sseEmitter.send("Message 1"); calledImei = false; } catch (IOException e) { sseEmitter.complete(); return sseEmitter;
ServerSentEvent.class.isAssignableFrom(elementClass)) { logExecutorWarning(returnType); SseEmitter emitter = new SseEmitter(STREAMING_TIMEOUT_VALUE); new SseEmitterSubscriber(emitter, this.taskExecutor).connect(adapter, returnValue); return emitter;
//... private SseEmitter emitter; @RequestMapping(value = "/{imei}", method = RequestMethod.GET) public User getUser(@PathVariable String imei) { User myUser = null; // .. do resolving of myUser (e.g. database etc). // Send message to "connected" web page: if (emitter != null) { emitter.send(myUser.toString()); // Or format otherwise, e.g. JSON. } // This return value goes back as a response to your android device // i.e. the caller of the getUser rest service. return myUser; } @RequestMapping(value = "/sse") public SseEmitter getSseEmitter() { emitter = new SseEmitter(); return emitter; }