Top Description Inners Fields Constructors Methods
com.google.common.eventbus

public Class EventBus

extends Object
Class Inheritance
Known Direct Subclasses
com.google.common.eventbus.AsyncEventBus
Annotations
@ElementTypesAreNonnullByDefault
Static Imports
com.google.common.base.Preconditions.checkNotNull

Dispatches events to listeners, and provides ways for listeners to register themselves.

Avoid EventBus

We recommend against using EventBus. It was designed many years ago, and newer libraries offer better ways to decouple components and react to events.

To decouple components, we recommend a dependency-injection framework. For Android code, most apps use Dagger. For server code, common options include Guice and Spring. Frameworks typically offer a way to register multiple listeners independently and then request them together as a set (Dagger, Guice, Spring).

To react to events, we recommend a reactive-streams framework like RxJava (supplemented with its RxAndroid extension if you are building for Android) or Project Reactor. (For the basics of translating code from using an event bus to using a reactive-streams framework, see these two guides: 1, 2.) Some usages of EventBus may be better written using Kotlin coroutines, including Flow and Channels. Yet other usages are better served by individual libraries that provide specialized support for particular use cases.

Disadvantages of EventBus include:

EventBus Summary

The EventBus allows publish-subscribe-style communication between components without requiring the components to explicitly register with one another (and thus be aware of each other). It is designed exclusively to replace traditional Java in-process event distribution using explicit registration. It is not a general-purpose publish-subscribe system, nor is it intended for interprocess communication.

Receiving Events

To receive events, an object should:

  1. Expose a public method, known as the event subscriber, which accepts a single argument of the type of event desired;
  2. Mark it with a Subscribe annotation;
  3. Pass itself to an EventBus instance's register(Object) method.

Posting Events

To post an event, simply provide the event object to the post(Object) method. The EventBus instance will determine the type of event and route it to all registered listeners.

Events are routed based on their type — an event will be delivered to any subscriber for any type to which the event is assignable. This includes implemented interfaces, all superclasses, and all interfaces implemented by superclasses.

When post is called, all registered subscribers for an event are run in sequence, so subscribers should be reasonably quick. If an event may trigger an extended process (such as a database load), spawn a thread or queue it for later. (For a convenient way to do this, use an AsyncEventBus.)

Subscriber Methods

Event subscriber methods must accept only one argument: the event.

Subscribers should not, in general, throw. If they do, the EventBus will catch and log the exception. This is rarely the right solution for error handling and should not be relied upon; it is intended solely to help find problems during development.

The EventBus guarantees that it will not call a subscriber method from multiple threads simultaneously, unless the method explicitly allows it by bearing the AllowConcurrentEvents annotation. If this annotation is not present, subscriber methods need not worry about being reentrant, unless also called from outside the EventBus.

Dead Events

If an event is posted, but no registered subscribers can accept it, it is considered "dead." To give the system a second chance to handle dead events, they are wrapped in an instance of DeadEvent and reposted.

If a subscriber for a supertype of all events (such as Object) is registered, no event will ever be considered dead, and no DeadEvents will be generated. Accordingly, while DeadEvent extends Object, a subscriber registered to receive any Object will never receive a DeadEvent.

This class is safe for concurrent use.

See the Guava User Guide article on EventBus.

Author
Cliff Biffle
Since
10.0

Nested and Inner Type Summary

Modifier and TypeClass and Description
pack-priv static class
EventBus.LoggingHandler

Simple logging handler for subscriber exceptions.

Field Summary

Modifier and TypeField and Description
private final Dispatcher
private final SubscriberExceptionHandler
private final Executor
private final String
private static final Logger
private final SubscriberRegistry

Constructor Summary

AccessConstructor and Description
public
EventBus()

Creates a new EventBus named "default".

public
EventBus(String
a brief name for this bus, for logging purposes. Should be a valid Java identifier.
identifier
)

Creates a new EventBus with the given identifier.

public
EventBus(SubscriberExceptionHandler
Handler for subscriber exceptions.
exceptionHandler
)

Creates a new EventBus with the given SubscriberExceptionHandler.

pack-priv
EventBus(String identifier, Executor executor, Dispatcher dispatcher, SubscriberExceptionHandler exceptionHandler)

Method Summary

Modifier and TypeMethod and Description
pack-priv final Executor
executor()

Returns the default executor this event bus uses for dispatching events to subscribers.

pack-priv void
handleSubscriberException(Throwable e, SubscriberExceptionContext context)

Handles the given exception thrown by a subscriber with the given context.

public final String
identifier()

Returns the identifier for this event bus.

public void
post(Object
event to post.
event
)

Posts an event to all registered subscribers.

public void
register(Object
object whose subscriber methods should be registered.
object
)

Registers all subscriber methods on object to receive events.

public String
toString()

Overrides java.lang.Object.toString.

Returns a string representation of the object.
public void
unregister(Object
object whose subscriber methods should be unregistered.
object
)

Unregisters all subscriber methods on a registered object.

Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAllwaitwaitwait

Field Detail

dispatcherback to summary
private final Dispatcher dispatcher
exceptionHandlerback to summary
private final SubscriberExceptionHandler exceptionHandler
executorback to summary
private final Executor executor
identifierback to summary
private final String identifier
loggerback to summary
private static final Logger logger
subscribersback to summary
private final SubscriberRegistry subscribers

Constructor Detail

EventBusback to summary
public EventBus()

Creates a new EventBus named "default".

EventBusback to summary
public EventBus(String identifier)

Creates a new EventBus with the given identifier.

Parameters
identifier:String

a brief name for this bus, for logging purposes. Should be a valid Java identifier.

EventBusback to summary
public EventBus(SubscriberExceptionHandler exceptionHandler)

Creates a new EventBus with the given SubscriberExceptionHandler.

Parameters
exceptionHandler:SubscriberExceptionHandler

Handler for subscriber exceptions.

Since
16.0
EventBusback to summary
pack-priv EventBus(String identifier, Executor executor, Dispatcher dispatcher, SubscriberExceptionHandler exceptionHandler)

Method Detail

executorback to summary
pack-priv final Executor executor()

Returns the default executor this event bus uses for dispatching events to subscribers.

handleSubscriberExceptionback to summary
pack-priv void handleSubscriberException(Throwable e, SubscriberExceptionContext context)

Handles the given exception thrown by a subscriber with the given context.

identifierback to summary
public final String identifier()

Returns the identifier for this event bus.

Since
19.0
postback to summary
public void post(Object event)

Posts an event to all registered subscribers. This method will return successfully after the event has been posted to all subscribers, and regardless of any exceptions thrown by subscribers.

If no subscribers have been subscribed for event's class, and event is not already a DeadEvent, it will be wrapped in a DeadEvent and reposted.

Parameters
event:Object

event to post.

registerback to summary
public void register(Object object)

Registers all subscriber methods on object to receive events.

Parameters
object:Object

object whose subscriber methods should be registered.

toStringback to summary
public String toString()

Overrides java.lang.Object.toString.

Doc from java.lang.Object.toString.

Returns a string representation of the object.

Returns:String

a string representation of the object.

Annotations
@Override
unregisterback to summary
public void unregister(Object object)

Unregisters all subscriber methods on a registered object.

Parameters
object:Object

object whose subscriber methods should be unregistered.

Exceptions
IllegalArgumentException:
if the object was not previously registered.
com.google.common.eventbus back to summary

pack-priv final Class EventBus.LoggingHandler

extends Object
implements SubscriberExceptionHandler
Class Inheritance
All Implemented Interfaces
com.google.common.eventbus.SubscriberExceptionHandler

Simple logging handler for subscriber exceptions.

Field Summary

Modifier and TypeField and Description
pack-priv static final EventBus.LoggingHandler

Constructor Summary

AccessConstructor and Description
pack-priv

Method Summary

Modifier and TypeMethod and Description
public void
private static Logger
private static String
Inherited from java.lang.Object:
cloneequalsfinalizegetClasshashCodenotifynotifyAlltoStringwaitwaitwait

Field Detail

INSTANCEback to summary
pack-priv static final EventBus.LoggingHandler INSTANCE

Constructor Detail

LoggingHandlerback to summary
pack-priv LoggingHandler()

Method Detail

handleExceptionback to summary
public void handleException(Throwable exception, SubscriberExceptionContext context)

Implements com.google.common.eventbus.SubscriberExceptionHandler.handleException.

Doc from com.google.common.eventbus.SubscriberExceptionHandler.handleException.

Handles exceptions thrown by subscribers.

Annotations
@Override
loggerback to summary
private static Logger logger(SubscriberExceptionContext context)
messageback to summary
private static String message(SubscriberExceptionContext context)