public class SequentialListenerManager extends AbstractListenerManager
Listeners are executed in insertion order. This provides a clear flow of execution unlike other ListenerManagers. As a result, if needed this supports completely single thread execution of PircBotX.
If a listener throws an Exception a ListenerExceptionEvent is dispatched. If an exception is thrown when handling that event, the exception is logged to prevent a potential StackOverflow.
As not all listeners should run in the network loop, this provides 3 listener executors
addListener(org.pircbotx.hooks.Listener)
) -
Run each event in the provided getExecutorPool()
. By default uses
the unbounded Executors.newCachedThreadPool(java.util.concurrent.ThreadFactory)
but this means listeners can potentially run into synchronization issues.
Useful as mean loop will never deadlockExecutors.newSingleThreadExecutor(java.util.concurrent.ThreadFactory)
. Any blocking calls (eg send(), WaitforQueue, querying an API on the
internet) will stall processing of further events for that listener. Useful
for logging and stats collectionModifier and Type | Class and Description |
---|---|
static class |
SequentialListenerManager.InlineListenerExecutor |
static interface |
SequentialListenerManager.ListenerExecutor |
static class |
SequentialListenerManager.PooledListenerExecutor |
static class |
SequentialListenerManager.SequentialListenerExecutor |
static class |
SequentialListenerManager.SequentialListenerManagerBuilder |
Modifier and Type | Method and Description |
---|---|
void |
addListener(Listener listener)
Alias of
#appendListenerPooled(org.pircbotx.hooks.Listener) |
SequentialListenerManager |
addListenerExecutor(int index,
Listener listener,
SequentialListenerManager.ListenerExecutor executor)
Add a listener at the given index to be executed by the supplied executor
|
SequentialListenerManager |
addListenerExecutor(Listener listener,
SequentialListenerManager.ListenerExecutor executor)
Add a listener to be executed by the supplied executor
|
SequentialListenerManager |
addListenerInline(Listener listener)
Add listener to be executed in the "bot/network loop"
|
SequentialListenerManager |
addListenerPooled(Listener listener)
Add listener to be executed in the main executor pool
|
SequentialListenerManager |
addListenerPooled(Listener listener,
Executor suppliedPool)
Add listener to be executed in the supplied executor pool
|
SequentialListenerManager |
addListenerSequential(Listener listener)
Add listener to be executed in its sequential single thread
|
static SequentialListenerManager.SequentialListenerManagerBuilder |
builder() |
Executor |
getExecutorPool()
The default pool all pooled listeners are executed in
|
com.google.common.collect.ImmutableSet<Listener> |
getListeners()
Gets all listeners that are in this ListenerManager
|
ThreadFactory |
getSequentialThreadFactory()
Creates threads used in sequential listeners
|
boolean |
listenerExists(Listener listener)
Check if a listener is in this ListenerManager
|
static SequentialListenerManager |
newDefault()
Create with
executorPool = Executors.newCachedThreadPool();
sequentialThreadFactory = Executors.defaultThreadFactory();
|
void |
onEvent(Event event)
Sends event to all appropriate listeners.
|
boolean |
removeListener(Listener listener)
Remove a listener from this ListenerManager
|
void |
shutdown(PircBotX bot) |
SequentialListenerManager |
updateExecutor(Listener listener,
SequentialListenerManager.ListenerExecutor executor)
Replace the executor for the supplied listener
|
SequentialListenerManager |
updateExecutorAllInline()
Replace all executors with the inline executor
|
public void onEvent(Event event)
ListenerManager
onEvent
in interface ListenerManager
onEvent
in class AbstractListenerManager
event
- The event to sendpublic void addListener(Listener listener)
#appendListenerPooled(org.pircbotx.hooks.Listener)
listener
- public SequentialListenerManager addListenerInline(Listener listener)
SequentialListenerManager
public SequentialListenerManager addListenerPooled(Listener listener)
SequentialListenerManager
public SequentialListenerManager addListenerPooled(Listener listener, Executor suppliedPool)
SequentialListenerManager
public SequentialListenerManager addListenerSequential(Listener listener)
SequentialListenerManager
public SequentialListenerManager addListenerExecutor(Listener listener, SequentialListenerManager.ListenerExecutor executor)
public SequentialListenerManager addListenerExecutor(int index, Listener listener, SequentialListenerManager.ListenerExecutor executor)
public SequentialListenerManager updateExecutor(Listener listener, SequentialListenerManager.ListenerExecutor executor)
public SequentialListenerManager updateExecutorAllInline()
public boolean removeListener(Listener listener)
ListenerManager
listener
- The listener to removepublic boolean listenerExists(Listener listener)
ListenerManager
listener
- The listener instance to look forpublic com.google.common.collect.ImmutableSet<Listener> getListeners()
ListenerManager
public void shutdown(PircBotX bot)
public static SequentialListenerManager newDefault()
executorPool = Executors.newCachedThreadPool();
sequentialThreadFactory = Executors.defaultThreadFactory();
@Generated(value="lombok") public static SequentialListenerManager.SequentialListenerManagerBuilder builder()
@Generated(value="lombok") public ThreadFactory getSequentialThreadFactory()
@Generated(value="lombok") public Executor getExecutorPool()
Copyright © 2010–2020 Leon Blakey. All rights reserved.