@RequestMapping(value = "stream/events/{rateLimiterName}/{eventType}", produces = MEDIA_TYPE_TEXT_EVENT_STREAM) public SseEmitter getEventsStreamFilteredByRateLimiterNameAndEventType(@PathVariable("rateLimiterName") String rateLimiterName, @PathVariable("eventType") String eventType) { RateLimiterEvent.Type targetType = RateLimiterEvent.Type.valueOf(eventType.toUpperCase()); RateLimiter rateLimiter = rateLimiterRegistry.getAllRateLimiters() .find(rL -> rL.getName().equals(rateLimiterName)) .getOrElseThrow(() -> new IllegalArgumentException(String.format("rate limiter with name %s not found", rateLimiterName))); Flux<RateLimiterEvent> eventStream = toFlux(rateLimiter.getEventPublisher()) .filter(event -> event.getEventType() == targetType); return RateLimiterEventsEmitter.createSseEmitter(eventStream); } }
@Test public void shouldConsumeOnSuccessEvent() throws Throwable { rateLimiter.getEventPublisher() .onSuccess(event -> logger.info(event.getEventType().toString())); String result = rateLimiter.executeSupplier(() -> "Hello world"); assertThat(result).isEqualTo("Hello world"); then(logger).should(times(1)).info("SUCCESSFUL_ACQUIRE"); }
Seq<Flux<RateLimiterEvent>> eventStreams = rateLimiterRegistry.getAllRateLimiters().map(rateLimiter -> ReactorAdapter.toFlux(rateLimiter.getEventPublisher())); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(Flux.merge(eventStreams), e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); }); new IllegalArgumentException(String.format("rate limiter with name %s not found", rateLimiterName))); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(ReactorAdapter.toFlux(rateLimiter.getEventPublisher()), e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); }); .getBufferedEvents() .sorted(Comparator.comparing(RateLimiterEvent::getCreationTime)) .filter(event -> event.getEventType() == RateLimiterEvent.Type.valueOf(eventType.toUpperCase())) .map(RateLimiterEventDTO::createRateLimiterEventDTO).toJavaList(); d.success(new RateLimiterEventsEndpointResponse(eventsList)); new IllegalArgumentException(String.format("rate limiter with name %s not found", rateLimiterName))); Flux<RateLimiterEvent> eventStream = ReactorAdapter.toFlux(rateLimiter.getEventPublisher()) .filter(event -> event.getEventType() == RateLimiterEvent.Type.valueOf(eventType.toUpperCase())); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(eventStream, e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); });
Seq<Flux<RateLimiterEvent>> eventStreams = rateLimiterRegistry.getAllRateLimiters().map(rateLimiter -> ReactorAdapter.toFlux(rateLimiter.getEventPublisher())); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(Flux.merge(eventStreams), e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); }); new IllegalArgumentException(String.format("rate limiter with name %s not found", rateLimiterName))); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(ReactorAdapter.toFlux(rateLimiter.getEventPublisher()), e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); }); .getBufferedEvents() .sorted(Comparator.comparing(RateLimiterEvent::getCreationTime)) .filter(event -> event.getEventType() == RateLimiterEvent.Type.valueOf(eventType.toUpperCase())) .map(RateLimiterEventDTO::createRateLimiterEventDTO).toJavaList(); d.success(new RateLimiterEventsEndpointResponse(eventsList)); new IllegalArgumentException(String.format("rate limiter with name %s not found", rateLimiterName))); Flux<RateLimiterEvent> eventStream = ReactorAdapter.toFlux(rateLimiter.getEventPublisher()) .filter(event -> event.getEventType() == RateLimiterEvent.Type.valueOf(eventType.toUpperCase())); Function<RateLimiterEvent, String> data = r -> Jackson.getObjectWriter(chain1.getRegistry()).writeValueAsString(RateLimiterEventDTO.createRateLimiterEventDTO(r)); ServerSentEvents events = ServerSentEvents.serverSentEvents(eventStream, e -> e.id(RateLimiterEvent::getRateLimiterName).event(c -> c.getEventType().name()).data(data)); ctx.render(events); });
@RequestMapping(value = "events/{rateLimiterName}/{eventType}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public RateLimiterEventsEndpointResponse getEventsFilteredByRateLimiterNameAndEventType(@PathVariable("rateLimiterName") String rateLimiterName, @PathVariable("eventType") String eventType) { RateLimiterEvent.Type targetType = RateLimiterEvent.Type.valueOf(eventType.toUpperCase()); List<RateLimiterEventDTO> eventsList = eventsConsumerRegistry.getEventConsumer(rateLimiterName).getBufferedEvents() .filter(event -> event.getRateLimiterName().equals(rateLimiterName)) .filter(event -> event.getEventType() == targetType) .map(RateLimiterEventDTO::createRateLimiterEventDTO).toJavaList(); return new RateLimiterEventsEndpointResponse(eventsList); }
@ReadOperation public RateLimiterEventsEndpointResponse getEventsFilteredByRateLimiterNameAndEventType(@Selector String name, @Selector String eventType) { RateLimiterEvent.Type targetType = RateLimiterEvent.Type.valueOf(eventType.toUpperCase()); List<RateLimiterEventDTO> eventsList = eventsConsumerRegistry.getEventConsumer(name).getBufferedEvents() .filter(event -> event.getRateLimiterName().equals(name)) .filter(event -> event.getEventType() == targetType) .map(RateLimiterEventDTO::createRateLimiterEventDTO).toJavaList(); return new RateLimiterEventsEndpointResponse(eventsList); } }
@Test public void shouldConsumeOnFailureEvent() throws Throwable { rateLimiter.getEventPublisher() .onFailure(event -> logger.info(event.getEventType().toString())); rateLimiter.executeSupplier(() -> "Hello world"); Try.ofSupplier(RateLimiter.decorateSupplier(rateLimiter, () -> "Hello world")); then(logger).should(times(1)).info("FAILED_ACQUIRE"); }