![JAR search and dependency download from the Maven repository](/logo.png)
net.engio.mbassy.bus.common.IMessageBus Maven / Gradle / Ivy
package net.engio.mbassy.bus.common;
import net.engio.mbassy.bus.publication.ISyncAsyncPublicationCommand;
/**
* A message bus offers facilities for publishing messages to the message handlers of registered listeners.
* A message publication starts when an object is send to the bus using one of the its publication methods.
*
* Messages can be published synchronously or asynchronously and may be of any type that is a valid sub type of the type parameter T.
* Message handlers can be invoked synchronously or asynchronously depending on their configuration. Thus, there
* are two notions of synchronicity / asynchronicity. One on the caller side, e.g. the invocation of the message publishing
* methods. The second on the handler side, e.g. whether the handler is invoked in the same or a different thread.
*
*
* Each message publication is isolated from all other running publications such that it does not interfere with them.
* Hence, the bus generally expects message handlers to be stateless as it may invoke them concurrently if multiple
* messages get published asynchronously. If handlers are stateful and not thread-safe they can be marked to be invoked
* in a synchronized fashion using @Synchronized annotation
*
*
* A listener is any object that defines at least one message handler and that has been subscribed to at least
* one message bus. A message handler can be any method that accepts exactly one parameter (the message) and is marked
* as a message handler using the @Handler annotation.
*
*
* By default, the bus uses weak references to all listeners such that registered listeners do not need to
* be explicitly unregistered to be eligible for garbage collection. Dead (garbage collected) listeners are
* removed on-the-fly as messages get dispatched. This can be changed using the @Listener annotation.
*
*
* Generally message handlers will be invoked in inverse sequence of subscription but any
* client using this bus should not rely on this assumption. The basic contract of the bus is that it will deliver
* a specific message exactly once to each of the respective message handlers.
*
*
* Messages are dispatched to all listeners that accept the type or supertype of the dispatched message. Additionally
* a message handler may define filters to narrow the set of messages that it accepts.
*
*
* Subscribed message handlers are available to all pending message publications that have not yet started processing.
* Any message listener may only be subscribed once -> subsequent subscriptions of an already subscribed message listener
* will be silently ignored)
*
*
* Removing a listener (unsubscribing) means removing all subscribed message handlers of that listener. This remove operation
* immediately takes effect and on all running dispatch processes -> A removed listener (a listener
* is considered removed after the remove(Object) call returned) will under no circumstances receive any message publications.
* Any running message publication that has not yet delivered the message to the removed listener will not see the listener
* after the remove operation completed.
*
*
* NOTE: Generic type parameters of messages will not be taken into account, e.g. a List will
* get dispatched to all message handlers that take an instance of List as their parameter
*
* @author bennidi
* Date: 2/8/12
*/
public interface IMessageBus
extends GenericMessagePublicationSupport{
/**
* {@inheritDoc}
*/
@Override
P post(T message);
/**
* Check whether any asynchronous message publications are pending to be processed
*
* @return true if any unfinished message publications are found
*/
boolean hasPendingMessages();
/**
* Shutdown the bus such that it will stop delivering asynchronous messages. Executor service and
* other internally used threads will be shutdown gracefully. After calling shutdown it is not safe
* to further use the message bus.
*/
void shutdown();
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy