Spring integration
-
Upload
oliver-gierke -
Category
Documents
-
view
5.878 -
download
3
description
Transcript of Spring integration
NOT CONFIDENTIAL - TELL EVERYONE
EAI Patterns with Spring IntegrationOliver Gierke, EngineerSpringSource, a division of VMware
About Me
2
Oliver Gierke
SpringSource Spring Data
www.olivergierke.deolivergierke
3
Agenda
• What is EAI?
• Messaging
• Pipes and Filters
• EAI Patterns
• Spring Integration 2.0
• Spring Integration 2.1
What is EAI?
4
(Don’t try this at home)
5
A Better Solution: Spring Integration
• Spring Integration Brings EAI To Your Application
• not the other way ‘round
• Provides the best support for “Enterprise Integration Patterns”
• patterns are built right into the API
• Heavy Emphasis on “channels”
• other solutions omit this key concept
6
Messaging
• Integrates two different systems
• Different parties need to share the same data contract
• Not the same service contract
• Fault tolerant, since requests are enqueued and delivered as possible
• AMQP, JMS provide powerful, robust options
7
Messaging
8
Data Processing with Spring: Integration
• Messaging works by decoupling systems
• The Spring messaging machinery lets you react to messages, declaratively
• Spring Integration takes this approach to the next level
9
?
?
Events
Data Processing with Spring: Messaging
• JMS
• Standard in the Java space
• Lots of open source options
• Provided with Java EE application servers
• Spring JMS
10
Data Processing with Spring: Messaging
11
Java producers
C
C
C
P
P
queue
Java consumers
queue
Message broker
• Sending JMS Messages
• Inject an instance of Spring's JmsTemplate.
• Provide the JMS ConnectionFactory in the JmsTemplate bean definition.
12
JMS
@Component public class MessageSender {
@Autowired private JmsTemplate jmsTemplate;
public void send(String message) { this.jmsTemplate.convertAndSend("example.queue", message); }}
@Bean public ConnnectionFactory cf (){ return new CachingConnectionFactory(...); }@Bean public JmsTemplate template(){ return new JmsTemplate(this.cf()) ;}
13
JMS
Data Processing with Spring: Messaging
• AMQP
• Real standard
• A product of the the companies with the most mission critical requirements
• Spring AMQP
14
Data Processing with Spring: Messaging
15
AMQP producers
C
C
C
P queue
AMQP consumers
queue
Message broker
X
P X
exchanges
• Sending AMQP Messages
• Use AmqpTemplate instead of JmsTemplate (accepts exchange and routingKey).
• Nothing changes on the listener side (just a POJO).
@Component public class MessageSender {
@Autowired private AmqpTemplate amqpTemplate;
public void send(String message) { this.amqpTemplate.convertAndSend( "myExchange", "some.routing.key", message); }}
16
AMQP
• HTTP Messaging (Request/Reply)
• Use RestTemplate, passing URI to methods based on HTTP methods
• Configure HttpMessageConverters if out-of-the-box support is insufficient
17
HTTP
public class HttpClient {
private final String uri = “http://localhost/demo/{name}”; private final RestTemplate template = new RestTemplate();
public String getResource(String name) { this.template.getForObject(uri, String.class, name); }
public URI postResource(String name, Object resource) { this.template.postForLocation(uri, resource, name); }}
18
HTTP
• Sending Mail Messages
• Create a SimpleMailMessage instance (or JavaMail MimeMessage).
• Use MailSender (or JavaMailSender) configured with host/user/password, etc.
19
@Component public class MailClient {
@Autowired private MailSender mailSender;
public void send(String subject, String to, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setSubject(subject); message.setTo(to); message.setText(text); this.mailSender.send(message); }}
Pipes and Filters
20
Pipes and Filters
• Messaging
• Payload can be any object
• Header values are stored in a Map
21
• Message and Headers
Pipes and Filters
22
public interface Message<T> { MessageHeaders getHeaders(); T getPayload();}
Message<String> m1 = MessageBuilder.withPayload(“foo”) .setHeader(“itemId”, 123).build();Message<String> m2 = MessageBuilder.fromMessage(m1) .setHeader(“itemId”, 456).build();
MessageHeaders headers = message.getHeaders();long timestamp = headers.getTimestamp();String value = headers.get(“someKey”, String.class);
• Message channel
• Decouples Producers from Consumers
• Provides extension point for interceptors
•May be Point-to-Point
•Or Publish/Subscribe
Pipes and Filters
23
Pipes and Filters
24
<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" />
• Message channel Types
Pipes and Filters
25
• Sending Messages
public interface MessageChannel { boolean send(Message<?> message); boolean send(Message<?> message, long timeout);}
MessagingTemplate template = new MessagingTemplate();template.send(someChannel, message);template.send(“fooChannel”, message);template.convertAndSend(someChannel, “hello”);template.convertAndSend(“fooChannel”, someObject);template.setSendTimeout(5000);template.setDefaultChannel(someChannel);template.convertAndSend(someObject);
Pipes and Filters
26
• Receiving Messages
• Inversion of Control
• Endpoints delegate to Spring-managed objects
• Framework handles message reception and method invocation (including conversion)
• Similar but more abstract than Spring JMS
• Clean separation of Code and Configuration
<service-activator input-channel="requests" ref="loanBroker" method="processRequest" output-channel="quotes"/>
@Component public class LoanBroaker { public Message<Quote> processRequest( Message<Loan> loan) { }}
„Hello World“
27
• Message Endpoint
• Producers send Messages to a MessageChannel
• Depending on their type, MessageChannels may have PollingConsumers
• Or Event-Driven Consumers
28
Pipes and Filters
Enterprise Integration Patterns
29
Message Endpoint Types
30
• 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
Filtering and Routing
• Filter returns a boolean
• Router returns a channel name (or map key)
• Other routers included out of the box:
• recipient-list
• payload-type
• header-value,
• xpath, ...
31
<filter input-channel="customers" ref="customerRegistry" method="isVip" output-channel="vips" discard-channel="nonVips"/>
<router input-channel="customers" ref="customerRegistry" method="getStatus"> <mapping value="1" channel="platinum"/></router>
OddEven
32
• Splitter returns a Collection or Array
• Aggregator accepts a Collection or Array
• Default Splitter and Aggregator require no ref/method
• Aggregator also has ReleaseStrategy and CorrelationStrategy
Splitting and Aggregating
33
<splitter input-channel="orders" ref="orderRepository" method="getLineItems" output-channel="lineItems"/>
<aggregator input-channel="processedItems" ref="orderRepository" method="generateConfirmation" output-channel="confirmations"/>
Annotation Support
• Alternative to XML
34
@ServiceActivator(inputChannel=“accounts”)public void createAccount(Account account) {…}
@Filter(inputChannel=“customers”, outputChannel=“vips”)public boolean isVip(Customer customer) {…}
@Splitter(inputChannel=“orders”, outputChannel=“lineItems”)public List<LineItem> getLineItems(Order order) {…}
Expression Language Support
• Alternative option for ref/method in endpoints
• Mapping between Messages and Methods
35
<filter input-channel="customers" expression="payload.vip" output-channel="vips" discard-channel="nonVips"/>
public void createAccount( @Payload("firstName") String firstName, @Payload("lastName") String lastName, @Header("userInfo.account.id") String accountId) { …}
Book orders
36
Channel Adapters and Messaging Gateways
• Many, many Adapters
37
• HTTP (REST)
• WS (SOAP/POX)
• Mail (POP3/IMAP/SMTP)
• JDBC
• XMPP(S)
• Spring Events
• RSS/ATOM
• JMS
• AMQP
• TCP
• UDP
• File
• FTP(S)
• SFTP
• RMI
• Activiti BPMN 2
• MongoDB
• Redis
• Native File System Adapters
• SMPP(-S) (SMS gateways)
Feed
38
Channel Adapters (one-way)
39
<file:inbound-channel-adapter channel="fromFile" directory="${java.io.tmpdir}/input" filename-pattern="[a-z]+.txt"> <si:poller fixed-delay="5000" /></file:inbound-channel-adapter>
<jms:outbound-channel-adapter channel="toJms" destination="exampleQueue"/>
Gateways (request-reply)
40
<http:outbound-gateway request-channel="httpRequests" url="http://trafficexample.org/{zipCode}"> <http:uri-variable name="zipCode" expression="payload.address.zip" /></http:outbound-gateway>
<ws:outbound-gateway request-channel="weatherRequests" uri="http://weatherexample.org" marshaller="jaxb2Marshaller" />
Spring Integration 2.0
41
Major Themes
• Spring 3.0 support
• JDK 5 Support
• New Message Stores
• New Adapters
• Misc.
42
Spring 3.0
• ConversionService
• Spring Integration takes advantage of a configured conversion service whenever it wants to perform certain conversions, from a certain primitives to complex objects in message parameters, for example.
• default Spring Integration conversion service bean ID: integrationConversionService
• must implement org.springframework.core.convert.converter.Converter
43
<int:converter> <bean class="….MyConverterImplementation" /> </int:converter>
Spring 3.0
• Spring Expression Language
• through XML or Java
44
<int:recipient-list-router id="customRouter" input-channel="routingChannel"> <int:recipient channel="channel1" selector-expression="payload.equals('foo')"/> <int:recipient channel="channel2" selector-expression="headers.contains('bar')"/></int:recipient-list-router>
<int:router input-channel="inChannel" expression="payload + 'Channel'"/>
<filter input-channel="input" expression="payload.equals('nonsense')"/>
Spring 3.0
• Spring Expression Language
• through XML or Java
45
<int:transformer input-channel="inChannel" output-channel="outChannel" expression="payload.toUpperCase() + '- [' + T(java.lang.System).currentTimeMillis() + ']'" />
<filter input-channel="input" expression="payload.matches( #{filterPatterns.nonsensePattern})" />
Spring Integration 2.0
• New Adapters
• Drastically improved file system support
• JDBC inbound and outbound adapters
• RSS / ATOM
• XMPP
• TCP/
• Misc
• new JMS channel
• revised HTTP support
46
Spring Integration 2.1
47
Spring Integration 2.0
• Spring 3.1 support
• JDK 7 support
• Conversations
• New message stores
• New adapters
• AMQP / Redis / SMPP / Gemfire
• Misc
• Activiti
• Flex 1.5 / Comet
• Feedback
• What‘s valuable to you?
48
Productivity boosters: STS Visual Editor
49
Productivity Boosters: Forthcoming
• Productivity boosters
• STS template project
• Spring Roo addon
50
Links
• Spring Framework Documentation
• http://static.springsource.org/spring/docs/3.0.x
• Spring Integration Sandbox
• git.springsource.org/spring-integration/sandbox
• Spring Integration
• http://www.springsource.org/spring-integration
• Enterprise Integration Patterns
• http://enterpriseintegrationpatterns.com
• Sample Code
• http://git.springsource.org/spring-integration/samples
• Getting Started with Spring Integration
• http://blog.springsource.com/category/green-beans/
51
Credits
• Slides
• Mark Fisher, Josh Long, Adam Fitzgerald, Oliver Gierke
• Demos
• Spring Integration team
52