(oleg zhurakousky)spring integration-scala-intro

23
Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit Enterprise Integration Patterns using Scala and Spring Integration Oleg Zhurakousky SpringSource/VMware Twitter: z_oleg Email: [email protected]

Upload: skills-matter-talks

Post on 14-Jan-2015

1.713 views

Category:

Technology


0 download

DESCRIPTION

 

TRANSCRIPT

Page 1: (Oleg zhurakousky)spring integration-scala-intro

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

16Copyright 2005-2010 SpringSource. Copying, publishing or distributing without express written permission is prohibit

Tooling

Page 17: (Oleg zhurakousky)spring integration-scala-intro

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

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

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

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

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

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

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/