Package io.microsphere.event
Class AbstractEventDispatcher
- java.lang.Object
-
- io.microsphere.event.AbstractEventDispatcher
-
- All Implemented Interfaces:
EventDispatcher
,Listenable<EventListener<?>>
- Direct Known Subclasses:
DirectEventDispatcher
,ParallelEventDispatcher
public abstract class AbstractEventDispatcher extends java.lang.Object implements EventDispatcher
Abstract implementation ofEventDispatcher
that provides common functionality for dispatching events to registered listeners.This class manages the registration and removal of event listeners, maintains a cache of listeners organized by event type, and supports dispatching events using a specified execution strategy (e.g., sequential or parallel). It also supports sorting of listeners based on their priority via the
Prioritized
interface.Key Features
- Listener Registration: Supports adding and removing event listeners with type safety.
- Event Dispatching: Dispatches events to all relevant listeners using an execution strategy defined by an
Executor
. - Listener Priority: Listeners are sorted by priority before being notified of an event. Higher priority listeners (lower integer value) are executed first.
- Caching: Maintains a thread-safe mapping from event types to listeners for efficient dispatching.
- Service Loading: Optionally loads listeners via Java's SPI mechanism (
ServiceLoader
).
Example Usage
public class MyEvent extends Event {} public interface MyEventListener extends EventListener<MyEvent> { void onEvent(MyEvent event); } // Create a dispatcher with direct (sequential) execution AbstractEventDispatcher dispatcher = new DirectEventDispatcher(); // Register a listener dispatcher.addEventListener((MyEventListener) event -> System.out.println("Event received!")); // Dispatch an event dispatcher.dispatch(new MyEvent());
Extending This Class
Subclasses must provide a concrete implementation of the
getExecutor()
method that defines how events should be dispatched.- Since:
- 1.0.0
- Author:
- Mercy
- See Also:
EventDispatcher
,EventListener
,Event
,Listenable
,Prioritized
,ServiceLoader
-
-
Field Summary
-
Fields inherited from interface io.microsphere.event.EventDispatcher
DIRECT_EXECUTOR
-
-
Constructor Summary
Constructors Modifier Constructor Description protected
AbstractEventDispatcher(java.util.concurrent.Executor executor)
Constructor with an instance ofExecutor
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addEventListener(EventListener<?> listener)
Add aevent listener
void
dispatch(Event event)
Dispatch a event to the registeredevent listeners
protected void
doInListener(EventListener<?> listener, java.util.function.Consumer<java.util.Collection<EventListener>> consumer)
java.util.List<EventListener<?>>
getAllEventListeners()
Get all registeredevent listeners
java.util.concurrent.Executor
getExecutor()
TheExecutor
to dispatch aevent
protected void
loadEventListenerInstances()
Default, load the instances ofevent listeners
byServiceLoader
void
removeEventListener(EventListener<?> listener)
Remove aevent listener
protected java.util.stream.Stream<EventListener>
sortedListeners()
protected java.util.stream.Stream<EventListener>
sortedListeners(java.util.function.Predicate<? super java.util.Map.Entry<java.lang.Class<? extends Event>,java.util.List<EventListener>>> predicate)
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface io.microsphere.event.Listenable
addEventListeners, addEventListeners, removeAllEventListeners, removeEventListeners
-
-
-
-
Method Detail
-
addEventListener
public void addEventListener(EventListener<?> listener) throws java.lang.NullPointerException, java.lang.IllegalArgumentException
Description copied from interface:Listenable
Add aevent listener
- Specified by:
addEventListener
in interfaceListenable<EventListener<?>>
- Parameters:
listener
- aevent listener
If currentEventListener
is existed, returnfalse
- Throws:
java.lang.NullPointerException
- iflistener
argument isnull
java.lang.IllegalArgumentException
- iflistener
argument is not concrete instance
-
removeEventListener
public void removeEventListener(EventListener<?> listener) throws java.lang.NullPointerException, java.lang.IllegalArgumentException
Description copied from interface:Listenable
Remove aevent listener
- Specified by:
removeEventListener
in interfaceListenable<EventListener<?>>
- Parameters:
listener
- aevent listener
- Throws:
java.lang.NullPointerException
- iflistener
argument isnull
java.lang.IllegalArgumentException
-
getAllEventListeners
@Immutable public java.util.List<EventListener<?>> getAllEventListeners()
Description copied from interface:Listenable
Get all registeredevent listeners
- Specified by:
getAllEventListeners
in interfaceListenable<EventListener<?>>
- Returns:
- non-null read-only ordered
event listeners
- See Also:
EventListener.getPriority()
-
sortedListeners
protected java.util.stream.Stream<EventListener> sortedListeners()
-
sortedListeners
protected java.util.stream.Stream<EventListener> sortedListeners(java.util.function.Predicate<? super java.util.Map.Entry<java.lang.Class<? extends Event>,java.util.List<EventListener>>> predicate)
-
dispatch
public void dispatch(Event event)
Description copied from interface:EventDispatcher
Dispatch a event to the registeredevent listeners
- Specified by:
dispatch
in interfaceEventDispatcher
- Parameters:
event
- aevent
-
getExecutor
public final java.util.concurrent.Executor getExecutor()
Description copied from interface:EventDispatcher
TheExecutor
to dispatch aevent
- Specified by:
getExecutor
in interfaceEventDispatcher
- Returns:
- the non-null
Executor
- See Also:
EventDispatcher.DIRECT_EXECUTOR
-
doInListener
protected void doInListener(EventListener<?> listener, java.util.function.Consumer<java.util.Collection<EventListener>> consumer)
-
loadEventListenerInstances
protected void loadEventListenerInstances()
Default, load the instances ofevent listeners
byServiceLoader
It could be override by the sub-class
- See Also:
EventListener
,ServiceLoader.load(Class)
-
-