(Oleg zhurakousky)spring integration-scala-intro
-
Upload
skills-matter-talks -
Category
Technology
-
view
1.715 -
download
0
description
Transcript of (Oleg zhurakousky)spring integration-scala-intro
![Page 1: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/1.jpg)
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]
![Page 2: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/2.jpg)
2Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Enterprise Integration Patterns (EIP)
![Page 3: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/3.jpg)
3Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Messaging
• Integration starts with Messaging
![Page 4: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/4.jpg)
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
![Page 5: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/5.jpg)
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
![Page 6: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/6.jpg)
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
![Page 7: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/7.jpg)
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
![Page 8: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/8.jpg)
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
![Page 9: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/9.jpg)
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
![Page 10: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/10.jpg)
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
![Page 11: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/11.jpg)
11Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
The Big Picture
![Page 12: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/12.jpg)
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
![Page 13: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/13.jpg)
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" />
![Page 14: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/14.jpg)
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)"/>
![Page 15: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/15.jpg)
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)
![Page 16: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/16.jpg)
16Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Tooling
![Page 17: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/17.jpg)
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Where does Scala fit in?
![Page 18: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/18.jpg)
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.
![Page 19: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/19.jpg)
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit
Is XML or not to XML enough of an argument?
![Page 20: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/20.jpg)
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
![Page 21: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/21.jpg)
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")
![Page 22: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/22.jpg)
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. . .
![Page 23: (Oleg zhurakousky)spring integration-scala-intro](https://reader033.fdocuments.us/reader033/viewer/2022051611/54b58f704a7959b7468b4571/html5/thumbnails/23.jpg)
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/