From ceee0dd6cd72617023da312e9ecedbb535fec1df Mon Sep 17 00:00:00 2001 From: rkee Date: Sun, 7 Apr 2024 19:54:39 -0700 Subject: [PATCH] Initial commit for dual publishing TopologyRefreshEvent to EventBus Only include interface change to get a sense. --- .../cluster/event/TopologyRefreshEvent.java | 17 +++++++++++++- .../lettuce/core/event/DurationalEvent.java | 18 +++++++++++++++ .../lettuce/core/event/jfr/EventRecorder.java | 23 ++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/java/io/lettuce/core/event/DurationalEvent.java diff --git a/src/main/java/io/lettuce/core/cluster/event/TopologyRefreshEvent.java b/src/main/java/io/lettuce/core/cluster/event/TopologyRefreshEvent.java index af74f15a1f..c3870a72f3 100644 --- a/src/main/java/io/lettuce/core/cluster/event/TopologyRefreshEvent.java +++ b/src/main/java/io/lettuce/core/cluster/event/TopologyRefreshEvent.java @@ -4,6 +4,10 @@ import io.lettuce.core.RedisURI; import io.lettuce.core.event.Event; +import io.lettuce.core.event.DurationalEvent; + +import static io.lettuce.core.event.DurationalEvent.EventStatus.COMPLETED; +import static io.lettuce.core.event.DurationalEvent.EventStatus.IN_PROGRESS; /** * Event for initiating a topology refresh. @@ -11,16 +15,27 @@ * @author Mark Paluch * @since 6.1 */ -public class TopologyRefreshEvent implements Event { +public class TopologyRefreshEvent implements DurationalEvent, Event { private final List topologyRefreshSource; + private EventStatus status; public TopologyRefreshEvent(List topologyRefreshSource) { this.topologyRefreshSource = topologyRefreshSource; + this.status = IN_PROGRESS; } public List getTopologyRefreshSource() { return topologyRefreshSource; } + @Override + public void completeEvent() { + this.status = COMPLETED; + } + + @Override + public DurationalEvent.EventStatus getEventStatus() { + return status; + } } diff --git a/src/main/java/io/lettuce/core/event/DurationalEvent.java b/src/main/java/io/lettuce/core/event/DurationalEvent.java new file mode 100644 index 0000000000..52c4f7bed2 --- /dev/null +++ b/src/main/java/io/lettuce/core/event/DurationalEvent.java @@ -0,0 +1,18 @@ +package io.lettuce.core.event; + + +public interface DurationalEvent { + enum EventStatus { + /** + * An IN_PROGRESS event indicates the start of series actions and might have future event indicating the completion. + */ + IN_PROGRESS, + /** + * A COMPLETED event is in its final status and indicates the completion of previous event + * and will not have future event indicating status change. + */ + COMPLETED + } + void completeEvent(); + EventStatus getEventStatus(); +} diff --git a/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java b/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java index 718c132018..9d8bbc4a7b 100644 --- a/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java +++ b/src/main/java/io/lettuce/core/event/jfr/EventRecorder.java @@ -1,10 +1,14 @@ package io.lettuce.core.event.jfr; +import io.lettuce.core.event.DurationalEvent; import io.lettuce.core.event.Event; +import io.lettuce.core.event.EventBus; +import io.lettuce.core.event.RecordableEvent; /** * Event recorder that can delegate events from the {@link io.lettuce.core.event.EventBus} into a recording facility such as - * JFR. Transforming an {@link Event} into a recordable event is subject to the actual {@link EventRecorder} implementation. + * JFR and make dual publishing for {@link io.lettuce.core.event.DurationalEvent} to {@link io.lettuce.core.event.EventBus}. + * Transforming an {@link Event} into a recordable event is subject to the actual {@link EventRecorder} implementation. *

* You can record data by launching the application with recording enabled: * {@code java -XX:StartFlightRecording:filename=recording.jfr,duration=10s -jar app.jar}. @@ -30,6 +34,14 @@ static EventRecorder getInstance() { */ void record(Event event); + /** + * Record an event and publish an {@link DurationalEvent.EventStatus#COMPLETED} event to bus. + * + * @param event the event to record, must not be {@code null}. + * @param eventBus the event bus for dual publishing, must not be {@code null}. + */ + void record(T event, EventBus eventBus); + /** * Start recording an event. This method returns a {@link RecordableEvent} that can be recorded by calling * {@link RecordableEvent#record()}. These events can be used to measure time between start and record. @@ -38,6 +50,15 @@ static EventRecorder getInstance() { */ RecordableEvent start(Event event); + /** + * Start recording an event and publish an {@link DurationalEvent.EventStatus#IN_PROGRESS} event to bus. This method returns a {@link RecordableEvent} that can be recorded by calling + * {@link RecordableEvent#record()}. These events can be used to measure time between start and record. + * + * @param event the event to record, must not be {@code null}. + * @param eventBus the event bus for dual publishing, must not be {@code null}. + */ + RecordableEvent start(T event, EventBus eventBus); + /** * Interface defining a recordable event that is recorded on calling {@link #record()}. */