So far, you have seen that the MessageChannel
provides a
receive()
method that returns a Message
, and the
MessageHandler
provides a handle()
method that accepts a
Message
, but how do the messages get passed from the channel to the handler?
As mentioned earlier, the MessageBus
provides a runtime form of inversion of control, and
one of the primary responsibilities that it assumes is connecting the channels to the handlers. It also connects
MessageSources and MessageTargets to channels, and it manages the scheduling of pollers and dispatchers.
The MessageBus
is an example of a mediator. It performs a number of roles - mostly
by delegating to other strategies. One of its main responsibilities is to manage registration of the
MessageChannels
and endpoints, such as Channel Adapters
and Service Activators. It recognizes any of these instances that have been defined
within its ApplicationContext
.
The message bus handles several of the concerns so that the channels, sources, targets, and Message-handling objects can be as simple as possible. These responsibilities include the lifecycle management of message endpoints, the activation of subscriptions, and the scheduling of dispatchers (including the configuration of thread pools). The bus coordinates all of that behavior based upon the metadata provided in bean definitions. Furthermore, those bean definitions may be provided via XML and/or annotations (we will look at examples of both configuration options shortly).
The bus creates and schedules triggers for all of its registered endpoints. When an endpoint
receives a trigger event, it will poll the MessageSource
that
was provided in its metadata. For example, a Channel Adapter will poll the
referenced "source", and a Service Activator will poll the referenced
"input-channel".