Class SimpleApplicationEventMulticaster

java.lang.Object
org.springframework.context.event.AbstractApplicationEventMulticaster
org.springframework.context.event.SimpleApplicationEventMulticaster
All Implemented Interfaces:
Aware, BeanClassLoaderAware, BeanFactoryAware, ApplicationEventMulticaster

public class SimpleApplicationEventMulticaster extends AbstractApplicationEventMulticaster
Simple implementation of the ApplicationEventMulticaster interface.

Multicasts all events to all registered listeners, leaving it up to the listeners to ignore events that they are not interested in. Listeners will usually perform corresponding instanceof checks on the passed-in event object.

By default, all listeners are invoked in the calling thread. This allows the danger of a rogue listener blocking the entire application, but adds minimal overhead. Specify an alternative task executor to have listeners executed in different threads, for example from a thread pool.

Author:
Rod Johnson, Juergen Hoeller, Stephane Nicoll, Brian Clozel
See Also:
  • Constructor Details

    • SimpleApplicationEventMulticaster

      public SimpleApplicationEventMulticaster()
      Create a new SimpleApplicationEventMulticaster.
    • SimpleApplicationEventMulticaster

      public SimpleApplicationEventMulticaster(BeanFactory beanFactory)
      Create a new SimpleApplicationEventMulticaster for the given BeanFactory.
  • Method Details

    • setTaskExecutor

      public void setTaskExecutor(@Nullable Executor taskExecutor)
      Set a custom executor (typically a TaskExecutor) to invoke each listener with.

      Default is equivalent to SyncTaskExecutor, executing all listeners synchronously in the calling thread.

      Consider specifying an asynchronous task executor here to not block the caller until all listeners have been executed. However, note that asynchronous execution will not participate in the caller's thread context (class loader, transaction context) unless the TaskExecutor explicitly supports this.

      ApplicationListener instances which declare no support for asynchronous execution (ApplicationListener.supportsAsyncExecution() always run within the original thread which published the event, for example, the transaction-synchronized TransactionalApplicationListener.

      Since:
      2.0
      See Also:
    • getTaskExecutor

      @Nullable protected Executor getTaskExecutor()
      Return the current task executor for this multicaster.
      Since:
      2.0
    • setErrorHandler

      public void setErrorHandler(@Nullable ErrorHandler errorHandler)
      Set the ErrorHandler to invoke in case an exception is thrown from a listener.

      Default is none, with a listener exception stopping the current multicast and getting propagated to the publisher of the current event. If a task executor is specified, each individual listener exception will get propagated to the executor but won't necessarily stop execution of other listeners.

      Consider setting an ErrorHandler implementation that catches and logs exceptions (a la TaskUtils.LOG_AND_SUPPRESS_ERROR_HANDLER) or an implementation that logs exceptions while nevertheless propagating them (for example, TaskUtils.LOG_AND_PROPAGATE_ERROR_HANDLER).

      Since:
      4.1
    • getErrorHandler

      @Nullable protected ErrorHandler getErrorHandler()
      Return the current error handler for this multicaster.
      Since:
      4.1
    • multicastEvent

      public void multicastEvent(ApplicationEvent event)
      Description copied from interface: ApplicationEventMulticaster
      Multicast the given application event to appropriate listeners.

      Consider using ApplicationEventMulticaster.multicastEvent(ApplicationEvent, ResolvableType) if possible as it provides better support for generics-based events.

      If a matching ApplicationListener does not support asynchronous execution, it must be run within the calling thread of this multicast call.

      Parameters:
      event - the event to multicast
      See Also:
    • multicastEvent

      public void multicastEvent(ApplicationEvent event, @Nullable ResolvableType eventType)
      Description copied from interface: ApplicationEventMulticaster
      Multicast the given application event to appropriate listeners.

      If the eventType is null, a default type is built based on the event instance.

      If a matching ApplicationListener does not support asynchronous execution, it must be run within the calling thread of this multicast call.

      Parameters:
      event - the event to multicast
      eventType - the type of event (can be null)
      See Also:
    • invokeListener

      protected void invokeListener(ApplicationListener<?> listener, ApplicationEvent event)
      Invoke the given listener with the given event.
      Parameters:
      listener - the ApplicationListener to invoke
      event - the current event to propagate
      Since:
      4.1