To illustrate this point, consider a simple system, which just takes in a message, and sends it back capitalized, call it the Echo Gateway:
public interface EchoGateway {
String echo(String message);
}
and a test for this:
@Test
public void testEcho() {
String response = echoGateway.echo("Hello");
assertThat(response, is("HELLO"));
}
Sounds simple so far, an implementation using spring integration would take in the "message" and "transform" it by converting to its upper case and returning the enhanced message.
<?xml version="1.0" encoding="UTF-8"?> <beans:beans xmlns="http://www.springframework.org/schema/integration" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:beans="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.1.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <channel id="requestChannel"/> <gateway id="echoGateway" service-interface="rube.simple.EchoGateway" default-request-channel="requestChannel" /> <transformer input-channel="requestChannel" expression="payload.toUpperCase()" /> </beans:beans>
Works beautifully!!
The beauty of Spring Integration is that even if the Integration scenario grows complex, the facade that it presents back to the application continues to remain simple,
Consider a Rube Goldberg integration scenario:
First a diagram to describe the convoluted flow:

So what exactly does it do:
- It takes in a message of this type - "hello from spring integ",
- splits it up into individual words(hello, from, spring, integ),
- sends each word to a ActiveMQ queue,
- from the queue the word fragments are picked up by a enricher to capitalize each word,
- placing the response back into a response queue,
- It is picked up, resequenced based on the original sequence of the words,
- aggregated back into a sentence("HELLO FROM SPRING INTEG") and
- returned back to the application.
This is how a Spring Integration configuration for this kind of flow would look like:
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/integration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:int-jms="http://www.springframework.org/schema/integration/jms"
xmlns:beans="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd
http://www.springframework.org/schema/integration http://www.springframework.org/schema/integration/spring-integration-2.1.xsd
http://www.springframework.org/schema/integration/jms http://www.springframework.org/schema/integration/jms/spring-integration-jms-2.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<beans:import resource="broker.xml"/>
<channel id="requestChannel">
<queue/>
</channel>
<channel id="responseChannel">
<queue/>
</channel>
<gateway id="echoGateway" service-interface="rube.complicated.EchoGateway" default-request-channel="requestChannel" default-reply-channel="responseChannel" default-reply-timeout="5000" />
<channel id="toJmsOutbound"/>
<splitter input-channel="requestChannel" output-channel="toJmsOutbound" expression="payload.split('\s')">
</splitter>
<channel id="sequenceChannel">
</channel>
<int-jms:outbound-gateway request-channel="toJmsOutbound" reply-channel="sequenceChannel" request-destination="amq.outbound" extract-request-payload="true" />
<channel id="enhanceMessageChannel"/>
<channel id="toReplyQueueChannel"/>
<int-jms:inbound-gateway request-channel="enhanceMessageChannel" request-destination="amq.outbound" reply-channel="toReplyQueueChannel"/>
<transformer input-channel="enhanceMessageChannel" expression="(payload + '').toUpperCase()" output-channel="toReplyQueueChannel"/>
<resequencer input-channel="sequenceChannel" output-channel="aggregateChannel" release-partial-sequences="false"></resequencer>
<aggregator input-channel="aggregateChannel" output-channel="responseChannel" expression="T(com.google.common.base.Joiner).on(' ').join(![payload].toArray())"/>
<poller id="poller" fixed-delay="500" default="true"/>
</beans:beans>
There is so much complexity in this flow(hence the Rube Goldberg), however the facade that Spring Integration provides to the application continues to remain very simple.
@Test
public void testEcho() throws Exception{
String amessage = "Hello from Spring Integration";
String response = echoGateway.echo(amessage);
assertThat(response, is("HELLO FROM SPRING INTEGRATION"));
}
This in my mind is the essence of Spring Integration
I have a github repository with this code at https://github.com/bijukunjummen/rg-si.git
No comments:
Post a Comment