feat(event): Enhance event registration to support generic event consumers
This commit is contained in:
@@ -10,6 +10,7 @@ import java.util.concurrent.StructuredTaskScope.FailedException;
|
|||||||
import java.util.concurrent.StructuredTaskScope.Joiner;
|
import java.util.concurrent.StructuredTaskScope.Joiner;
|
||||||
import java.util.concurrent.StructuredTaskScope.Subtask;
|
import java.util.concurrent.StructuredTaskScope.Subtask;
|
||||||
import java.util.concurrent.StructuredTaskScope.Subtask.State;
|
import java.util.concurrent.StructuredTaskScope.Subtask.State;
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -57,7 +58,7 @@ public class EventExecutor {
|
|||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
try {
|
try {
|
||||||
consumers.getFirst().consumer().accept(event);
|
((Consumer<Event>) consumers.getFirst().consumer()).accept(event);
|
||||||
}
|
}
|
||||||
catch (final NoSuchElementException e) {
|
catch (final NoSuchElementException e) {
|
||||||
return;
|
return;
|
||||||
@@ -72,7 +73,7 @@ public class EventExecutor {
|
|||||||
tasks.clear();
|
tasks.clear();
|
||||||
for (final var consumer : consumers) {
|
for (final var consumer : consumers) {
|
||||||
tasks.add(scope.fork(() -> {
|
tasks.add(scope.fork(() -> {
|
||||||
consumer.consumer().accept(event);
|
((Consumer<Event>) consumer.consumer()).accept(event);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ public class EventHandlerRegistry {
|
|||||||
|
|
||||||
private final ConcurrentMap<Class<? extends Event>, List<EventConsumer>> handlers = new ConcurrentHashMap<>();
|
private final ConcurrentMap<Class<? extends Event>, List<EventConsumer>> handlers = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
public void register(final Class<? extends Event> eventClass, final String consumerId, final Consumer<Event> consumer) {
|
public <T extends Event> void register(final Class<T> eventClass, final String consumerId, final Consumer<T> consumer) {
|
||||||
final var eventConsumers = this.handlers.computeIfAbsent(eventClass, k -> new CopyOnWriteArrayList<>());
|
final var eventConsumers = this.handlers.computeIfAbsent(eventClass, k -> new CopyOnWriteArrayList<>());
|
||||||
eventConsumers.removeIf(ec -> ec.id().equals(consumerId));
|
eventConsumers.removeIf(ec -> ec.id().equals(consumerId));
|
||||||
eventConsumers.add(new EventConsumer(consumerId, consumer));
|
eventConsumers.add(new EventConsumer(consumerId, consumer));
|
||||||
@@ -27,6 +27,6 @@ public class EventHandlerRegistry {
|
|||||||
return this.handlers.get(eventClass);
|
return this.handlers.get(eventClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
record EventConsumer(String id, Consumer<Event> consumer) {
|
record EventConsumer(String id, Consumer<? extends Event> consumer) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import java.util.function.Consumer;
|
|||||||
|
|
||||||
public interface EventService {
|
public interface EventService {
|
||||||
|
|
||||||
void register(Class<? extends Event> eventClass, String consumerId, Consumer<Event> consumer);
|
<T extends Event> void register(Class<T> eventClass, String consumerId, Consumer<T> consumer);
|
||||||
|
|
||||||
void unregister(Class<? extends Event> eventClass, String consumerId);
|
void unregister(Class<? extends Event> eventClass, String consumerId);
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ public class EventServiceImpl implements EventService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void register(final Class<? extends Event> eventClass, final String consumerId, final Consumer<Event> consumer) {
|
public <T extends Event> void register(final Class<T> eventClass, final String consumerId, final Consumer<T> consumer) {
|
||||||
this.registry.register(eventClass, consumerId, consumer);
|
this.registry.register(eventClass, consumerId, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user