Enterprise Integration With Spring Integration: Agim Emruli Springsource 8100
Enterprise Integration With Spring Integration: Agim Emruli Springsource 8100
Presentation Goal
Learn how Spring Integration helps to solve common Enterprise Integration challenges
Integration Challenges
System Failures
Intolerant Systems
Message
Request Reply
Message Translator
Message Router
Return Address
Content FIlter
Composed Message
Splitter
Correlation ID
Recipient List
Dependency Injection
Inversion of Control
10
11
Application
Maintainable Flexible
Layered Architecture
12
Layered Architecture
12
Domain Objects
Layered Architecture
12
Domain Objects
Database
Messaging
Layered Architecture
12
Database
Messaging
Layered Architecture
12
Domain Objects
Database
Messaging
Layered Architecture
12
Domain Objects
Database
Messaging
Layered Architecture
AOP
12
Domain Objects
Database
Messaging
13
Layered Architecture
Spring Application
13
Layered Architecture
MVC
Spring Application
13
Layered Architecture
MVC
RMI
Spring Application
13
Layered Architecture
Webservice
MVC
RMI
Spring Application
13
Layered Architecture
Spring Application
13
Layered Architecture
JMS RMI
Spring Application
14
Framework
Event
Application
15
15
16
17
Goals
18
19
Incremental Extension
20
20
Services
20
Services
20
Services
20
Services
20
Transformer
Services
20
Transformer Router
Services
21
Message Construction
22
Message Structure
Message Header Sequence Number Sequence Size Expiration Date Correlation Identifier Message Body
C Command Message D Document Message E Event Message
23
Message Interface
Message Headers
24
Message Headers
String value = headers.get("key", String.class); Object id = headers.getId(); Long timestamp = headers.getTimestamp(); MessagePriority priority = headers.getPriority();
24
Message Builder
25
Message Builder
Message<String> message = MessageBuilder.withPayload("test") .setHeader("foo", 123) .setPriority(MessagePriority.HIGHEST) .build();
25
27
Message Channel
Message
Message
Message Endpoint
Channel
Message Endpoint
28
Direct Channels
Message Endpoint
Channel
Event-Driven Consumer
28
Direct Channels
Message Endpoint
Channel
Event-Driven Consumer
29
Queue Channel
Message Endpoint
Channel
Polling Consumer
29
Queue Channel
Message Endpoint
Channel
Polling Consumer
30
Publish-Subscribe Channel
Event-Driven Consumer
Message Endpoint
30
Publish-Subscribe Channel
Event-Driven Consumer
Message Endpoint
31
Priority Channel
Message Endpoint
Channel
Polling Consumer
Resequencer
31
Priority Channel
Message Endpoint
Channel
Polling Consumer
Resequencer
Message Transformation
32
33
Message Translator
Channel
Message Translator
Channel
33
Message Translator
Channel
Message Translator
Channel
34
Service Activator
35
36
Service Activator
Message Endpoint
Channel
Service Activator
Message Endpoint
Channel
37
Service Activator
<channel id="requests"/> <channel id="quotes"/> <service-activator input-channel="requests" ref="loanBroker" method="processRequest" output-channel="quotes"/> <beans:bean id="loanBroker" class="example.LoanBroker"/>
38
39
Message Routing
40
41
Channel
42
MethodInvokingRouter
<channel id="even"/> <channel id="odd"/> <router ref="parityResolver" inputchannel="numbers"/>
42
MethodInvokingRouter
<channel id="even"/> <channel id="odd"/> <router ref="parityResolver" inputchannel="numbers"/> @Router public String getParity(int i) { return (i % 2 == 0) ? "even" : "odd"; }
43
PayloadtypeRouter
String Channel
Channel
Integer Channel
43
PayloadtypeRouter
String Channel
Channel
Integer Channel
typeMap .put(String.class, stringChannel); typeMap.put(Integer.class, integerChannel); PayloadTypeRouter router = new PayloadTypeRouter(); router.setPayloadTypeChannelMap(typeMap); router.handleMessage(new StringMessage("test")); router.handleMessage(new GenericMessage(123));
44
ReceipientListRouter
Channel
Channel
Recipient List
Channel
44
ReceipientListRouter
Channel Channel Recipient List
Channel
channels.add(channel1); channels.add(channel2); RecipientListRouter router = new RecipientListRouter(); router.setChannels(channels); Message<String> message = new StringMessage("test"); router.handleMessage(message);
45
Channel
Splitter
Aggregator
Channel
46
46
@Aggregator public PurchaseOrder aggregateOrder(List<OrderItem> items) { // aggregate the items into a single order object... }
Channel Adapter
47
48
Channel Adapters
Inbound
Message External System Channel Adapter Channel
48
Channel Adapters
Inbound
Message External System Channel Adapter Channel
Outbound
Message Channel Channel Adapter External System
49
File Adapter
<file:inbound-channel-adapter channel="filesIn" directory="${java.io.tmpdir}/test-input"> <poller max-messages-per-poll="5"> <cron-trigger expression="*/10 * * * * MON-FRI"/> </poller> </file:inbound-channel-adapter>
50
JMS Adapter
<jms:inbound-channel-adapter channel="input" connection-factory="connectionFactory" destination-name="sourceQueueName"/> <jms:outbound-channel-adapter channel="output" destination="targetQueue"/> <jms:inbound-gateway request-channel="inRequests" destination="inboundRequestQueue"/> <jms:outbound-gateway request-channel="outRequests" reply-channel="replies" jms-queue="outQueue"/>
51
52
Webservice Adapter
<ws:outbound-gateway uri="http://..." marshaller="someMarshaller" unmarshaller="someMarshaller" request-channel="req" reply-channel="rep"/>
53
Other Adapters
54
Q&A
Agim Emruli [email protected]
55
THANK YOU!
56
Picture Credits
http://www.flickr.com/photos/scraplab/2612334635/
http://www.flickr.com/photos/mylifestory/527847004/
http://www.flickr.com/photos/alex-s/116511016/
http://www.flickr.com/photos/jdan/2324469981/
57
Picture Credits
http://www.flickr.com/photos/global-jet/2125557004/