return sseBuilder.build(); });
return sseBuilder.build(); });
@GetMapping(path = "/instances/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<InstanceEvent>> eventStream() { return Flux.from(eventStore).map(event -> ServerSentEvent.builder(event).build()).mergeWith(ping()); }
return sseBuilder.build(); });
(ServerSentEvent<?>) element : ServerSentEvent.builder().data(element).build());
(ServerSentEvent<?>) element : ServerSentEvent.builder().data(element).build());
return sseBuilder.build(); });
@Bean Consumer<String> distributeEvent(final List<FluxSink<ServerSentEvent<Map>>> subscribers) { return message -> subscribers.forEach(fluxSink -> fluxSink.next(ServerSentEvent.<Map>builder() .id(UUID.randomUUID().toString()) .data(singletonMap("payload", message)) //.data(HashMap.of( // "payload", message, // "at", Instant.now() //).toJavaMap()) .event("message") .build())); } }
@GetMapping("/subscribe/order-book/{orderBookId}") public Flux<ServerSentEvent<OrderBookView>> subscribeToOrderBook(@PathVariable String orderBookId) { SubscriptionQueryResult<OrderBookView, OrderBookView> subscription = queryGateway .subscriptionQuery(new OrderBookByIdQuery(new OrderBookId(orderBookId)), ResponseTypes.instanceOf(OrderBookView.class), ResponseTypes.instanceOf(OrderBookView.class)); return subscription.initialResult().concatWith(subscription.updates()) .map(ob -> ServerSentEvent.builder(ob).build()); }
(ServerSentEvent<?>) element : ServerSentEvent.builder().data(element).build());
@RequestMapping("/sse/event") Flux<ServerSentEvent<String>> sse() { return INTERVAL.map(l -> ServerSentEvent.builder("foo") .id(Long.toString(l)) .comment("bar") .build()); }
(ServerSentEvent<?>) element : ServerSentEvent.builder().data(element).build());
@GetMapping(path = "/applications", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<Application>> applicationsStream() { return Flux.from(eventPublisher) .flatMap(event -> registry.getInstance(event.getInstance())) .map(this::getApplicationForInstance) .flatMap(group -> toApplication(group.getT1(), group.getT2())) .map(application -> ServerSentEvent.builder(application).build()) .mergeWith(ping()); }
@GetMapping(path = "/instances/{id}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) public Flux<ServerSentEvent<Instance>> instanceStream(@PathVariable String id) { return Flux.from(eventStore) .filter(event -> event.getInstance().equals(InstanceId.of(id))) .flatMap(event -> registry.getInstance(event.getInstance())) .map(event -> ServerSentEvent.builder(event).build()) .mergeWith(ping()); }
@Test public void writeServerSentEventsWithBuilder() throws Exception { ResolvableType type = ResolvableType.forClassWithGenerics(ServerSentEvent.class, String.class); EmitterProcessor<ServerSentEvent<?>> processor = EmitterProcessor.create(); SseEmitter sseEmitter = (SseEmitter) handleValue(processor, Flux.class, type); EmitterHandler emitterHandler = new EmitterHandler(); sseEmitter.initialize(emitterHandler); processor.onNext(ServerSentEvent.builder("foo").id("1").build()); processor.onNext(ServerSentEvent.builder("bar").id("2").build()); processor.onNext(ServerSentEvent.builder("baz").id("3").build()); processor.onComplete(); assertEquals("id:1\ndata:foo\n\nid:2\ndata:bar\n\nid:3\ndata:baz\n\n", emitterHandler.getValuesAsText()); }
@Test public void writeServerSentEvent() { ServerSentEvent<?> event = ServerSentEvent.builder().data("bar").id("c42").event("foo") .comment("bla\nbla bla\nbla bla bla").retry(Duration.ofMillis(123L)).build(); Mono<ServerSentEvent> source = Mono.just(event); testWrite(source, outputMessage, ServerSentEvent.class); StepVerifier.create(outputMessage.getBody()) .consumeNextWith(stringConsumer("id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:")) .consumeNextWith(stringConsumer("bar\n")) .consumeNextWith(stringConsumer("\n")) .expectComplete() .verify(); }
@Test public void ofServerSentEventFlux() { ServerSentEvent<String> event = ServerSentEvent.builder("foo").build(); Flux<ServerSentEvent<String>> body = Flux.just(event); BodyInserter<Flux<ServerSentEvent<String>>, ServerHttpResponse> inserter = BodyInserters.fromServerSentEvents(body); MockServerHttpResponse response = new MockServerHttpResponse(); Mono<Void> result = inserter.insert(response, this.context); StepVerifier.create(result).expectNextCount(0).expectComplete().verify(); }
Mono<ServerResponse> sse(ServerRequest request) { Flux<ServerSentEvent<String>> body = INTERVAL .map(aLong -> ServerSentEvent.builder("foo").id("" + aLong).comment("bar").build()); return ServerResponse.ok().body(fromServerSentEvents(body)); } }
@GetMapping("/event") Flux<ServerSentEvent<Person>> sse() { return INTERVAL.take(2).map(l -> ServerSentEvent.builder(new Person("foo " + l)) .id(Long.toString(l)) .comment("bar " + l) .build()); }