78 lines
4.7 KiB
XML
78 lines
4.7 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<chapter xmlns="http://docbook.org/ns/docbook" version="5.0" xml:id="applicationevent"
|
||
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
|
||
<title>Spring ApplicationEvent Support</title>
|
||
|
||
<para>
|
||
Spring Integration provides support for inbound and outbound <classname>ApplicationEvents</classname>
|
||
as defined by the underlying Spring Framework. For more information about Spring's support for events and listeners,
|
||
refer to the <ulink url="http://static.springsource.org/spring/docs/2.5.x/reference/beans.html#context-functionality-events">Spring Reference Manual</ulink>.
|
||
</para>
|
||
|
||
<section id="applicationevent-inbound">
|
||
<title>Receiving Spring ApplicationEvents</title>
|
||
<para>
|
||
To receive events and send them to a channel, simply define an instance of Spring Integration's
|
||
<classname>ApplicationEventListeningMessageProducer</classname>. This class is an implementation of
|
||
Spring's <interfacename>ApplicationListener</interfacename> interface. By default it will pass all
|
||
received events as Spring Integration Messages. To limit based on the type of event, configure the
|
||
list of event types that you want to receive with the 'eventTypes' property. If a received event
|
||
has a Message instance as its 'source', then that will be passed as-is. Otherwise, if a SpEL-based
|
||
"payloadExpression" has been provided, that will be evaluated against the ApplicationEvent instance.
|
||
If the event's source is not a Message instance and no "payloadExpression" has been provided, then
|
||
the ApplicationEvent itself will be passed as the payload.
|
||
</para>
|
||
<para>
|
||
For convenience namespace support is provided to configure an <classname>ApplicationEventListeningMessageProducer</classname>
|
||
via the <emphasis>inbound-channel-adapter</emphasis> element.
|
||
<programlisting language="xml"><![CDATA[<int-event:inbound-channel-adapter channel="eventChannel"
|
||
error-channel="eventErrorChannel"
|
||
event-types="example.FooEvent, example.BarEvent"/>
|
||
|
||
<int:publish-subscribe-channel id="eventChannel"/>]]></programlisting>
|
||
In the above example, all Application Context events that match one of the types specified by the 'event-types' (optional) attribute will be
|
||
delivered as Spring Integration Messages to the Message Channel named 'eventChannel'. If a downstream component throws
|
||
an exception, a MessagingException containing the failed message and exception will be sent to the channel named
|
||
'eventErrorChannel'. If no "error-channel" is specified and the downstream channels are synchronous, the Exception
|
||
will be propagated to the caller.
|
||
</para>
|
||
</section>
|
||
|
||
<section id="applicationevent-outbound">
|
||
<title>Sending Spring ApplicationEvents</title>
|
||
<para>
|
||
To send Spring <classname>ApplicationEvents</classname>, create an instance of the
|
||
<classname>ApplicationEventPublishingMessageHandler</classname> and register it within an endpoint.
|
||
This implementation of the <interfacename>MessageHandler</interfacename> interface also implements
|
||
Spring's <interfacename>ApplicationEventPublisherAware</interfacename> interface and thus acts as a
|
||
bridge between Spring Integration Messages and <classname>ApplicationEvents</classname>.
|
||
</para>
|
||
|
||
<para>
|
||
For convenience namespace support is provided to configure an <classname>ApplicationEventPublishingMessageHandler</classname>
|
||
via the <emphasis>outbound-channel-adapter</emphasis> element.
|
||
<programlisting language="xml"><![CDATA[<int:channel id="eventChannel"/>
|
||
|
||
<int-event:outbound-channel-adapter channel="eventChannel"/>]]></programlisting>
|
||
If you are using a PollableChannel (e.g., Queue), you can also provide <emphasis>poller</emphasis> as a sub-element of the
|
||
<emphasis>outbound-channel-adapter</emphasis> element. You can also optionally provide a <emphasis>task-executor</emphasis>
|
||
reference for that poller. The following example demonstrates both.
|
||
<programlisting language="xml"><![CDATA[<int:channel id="eventChannel">
|
||
<int:queue/>
|
||
</int:channel>
|
||
|
||
<int-event:outbound-channel-adapter channel="eventChannel">
|
||
<int:poller max-messages-per-poll="1" task-executor="executor" fixed-rate="100"/>
|
||
</int-event:outbound-channel-adapter>
|
||
|
||
<task:executor id="executor" pool-size="5"/>]]></programlisting>
|
||
|
||
In the above example, all messages sent to the 'eventChannel' channel will be published as ApplicationEvents to any relevant
|
||
ApplicationListener instances that are registered within the same Spring ApplicationContext. If the payload of the Message is
|
||
an ApplicationEvent, it will be passed as-is. Otherwise the Message itself will be wrapped in a MessagingEvent instance.
|
||
</para>
|
||
</section>
|
||
|
||
</chapter>
|