Upload
skills-matter-talks
View
1.718
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Enterprise Integration Patterns using
Scala and Spring Integration
Oleg ZhurakouskySpringSource/VMware
Twitter: z_olegEmail: [email protected]
2Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Enterprise Integration Patterns (EIP)
3Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Messaging
• Integration starts with Messaging
4Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Why Messaging?
• Logical Decoupling• Physical Decoupling
– Producer and Consumer are not aware of one another
• Easy to extend• Event-driven
5Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Pipes and Filters
– Endpoints (Filters) connected through– Channels (Pipes) exchanging– Message
$> cat foo.txt | grep the | while read l; do echo $l ; done
6Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Message
• Payload can be any object• Header values are stored in a Map
Headers
Payload
7Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Message Channel
• Decouples Producers from Consumers• Provides extension point for interceptors• May be Point-to-Point
• Or Publish/Subscribe
8Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Message Endpoint
• Producers send Messages to a Message Channel
• Depending on their type, Message Channels may have Polling Consumers
• Or Event-Driven Consumers
9Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Message Endpoint Types
• Transformer– Convert payload or modify headers
• Filter– Discard messages based on boolean evaluation
• Router– Determine next channel based on content
• Splitter– Generate multiple messages from one
• Aggregator– Assemble a single message from multiple
10Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
What is Spring Integration?
• Framework is a reference implementation of Enterprise Integration Patterns
• Built on top of Spring– Runs within any Spring ApplicationContext– All components are Spring-managed objects
11Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
The Big Picture
12Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Spring Programming Model
• Inversion of Control– Endpoints delegate to Spring-managed objects– Framework handles message reception and
method invocation
• Clean separation of Code and Configuration
13Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Message Channel Types
<channel id="sync-p2p"/>
<channel id="async-p2p"> <dispatcher task-executor="someThreadPool" /></channel>
<channel id="async-buffering-p2p"> <queue capacity="50" /></channel>
<publish-subscribe-channel id="sync-pubsub" />
<publish-subscribe-channel id="async-pubsub" task-executor="someThreadPool" />
14Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Messaging Endpoints
<int:gateway service-interface="foo.bar.MyGateway" default-request-channel="inChannel" />
<int:filter input-channel="inChannel" expression="payload.equals('World')"
output-channel="transformingChannel" />
<channel id="transformingChannel"> <dispatcher task-executor="executor" /></channel>
<int:transformer input-channel="transformingChannel" expression="'Hello ' + payload"
output-channel="loggingChannel" />
<int:service-activator input-channel="loggingChannel" expression="T(java.lang.System).out.println(payload)"/>
15Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Channel Adapters and Messaging Gateways
• JMS• AMQP• TCP/UDP• File/Resource• RMI• RSS/ATOM• FTP/FTPS/SFTP• NoSQL(Mongo,
Redis)
• HTTP (REST)• RIA (Flex, AJAX)• WS (SOAP/POX)• Mail (POP3/IMAP/SMTP)• JDBC• XMPP• Twitter• Spring Events• BPMN 2.0 (Activiti)
16Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Tooling
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Where does Scala fit in?
18Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Why Scala?
• There are 2 types of people in this world– Like to say - "Don't like XML"– "Don't like XML" - but understand that its
necessary evil. Appreciate alternatives but not overly concerned with the lack of.
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Is XML or not to XML enough of an argument?
20Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Why Scala? (cont. . .)
• True Type Safety vs IDE-Specific support• Typos and misconfiguration• Adding value based on the language features
21Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Welcome to SI Scala DSL
val messageFlow =
filter.using{p:String => p.equals("Cool World")} -->
transform.using{p:String => "Goodbye " + p} -->
handle.using{p:String => println(p)}
messageFlow.sendAndReceive[String]("Cool World")
22Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Welcome to SI Scala DSL
• Compile time validation vs initialization validation and type safety:
filter.using{p:String => "Cool World"} - (filter can *only* return Boolean)
type mismatch; found : String => java.lang.String required: Function1[_, Boolean]
transform.using{p:String => println} - (transformer *must* return non-Unit value)
handle.using{p:String => println(p)} -->
handle.using{p:String => println(p)}
- value --> is not a member of o.s.i.d.SendingIntegrationComposition
(the first handler returns Unit (nothing of value in Messaging terms therefore the flow
can't continue)
Etc. . .
23Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Relevant Info
• Enterprise Integration Patterns - http://www.eaipatterns.com/• Spring Integration project home -
http://www.springsource.org/spring-integration• Spring Integration Scala DSL home -
https://github.com/SpringSource/spring-integration-scala/wiki• Spring Integration Scala DSL blog -
http://blog.springsource.org/2012/03/05/introducing-spring-integration-scala-dsl/