SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Introduction to Spring Integration
Katowice, 04.02.2016
Dominik Strzyżewski
Logistics
• Around 2-2.5 hours
• On site presentation & webinar
• Questions at the end
Agenda
• High-level view
• Anatomy of an message and types of channels
• Endpoints
• Basic enterprise integration patterns
• Adapters
• Errors handling
• Extras *
High-level view
Main concepts
• Components can communicate using in-memory messaging
• Adapters to integrate with external systems
• Use of Spring framework programming model
• Based on Enterprise Integration Patterns book
• http://projects.spring.io/spring-integration
Sample workflow
http://docs.spring.io/autorepo/docs/spring-integration/2.0.x/reference/htmlsingle/images/cafe-eip.png
Adapters
• Application components are separated
from integration details
• External systems (file system, JMS) can
produce new message
• Implementation details not important for
components
• Payload is important! (and metadata)
• Spring Integration message can create
an external event (SOAP, JDBC)
http://www.javacodegeeks.com/2015/09/spring-integration-fundamentals.html
Hello World demo
Benefits
• Loose coupling
• Separation of concerns
• EDA
Competitors
• Apache Camel
• ESB:
• Mule ESB
• Apache ServiceMix
• Red Hat Fuse ESB
• IBM WebSphere ESB
• Oracle Enterprise Service Bus
• TIBCO ESB
http://www.infoq.com/articles/ESB-Integration
Anatomy of an message and types of
channels
Basic interaction
• An endpoint sends a message
• Endpoints are connected using MessageChannels
• Endpoints can receive messages from channels by:
• Subscribing (passive)
• Polling (active)
Message
• Messages are immutable
• GenericMessage
• MessageBuilder
• Payload is a Java object
• Headers:
• Predefined – always present
• Predefined – specific for each
component/adapter
• Custom
• From Spring 4: spring-messaging module
Message channel
• Connects endpoints
• No persistence (in-memory)
• Can be backed by messages store:
• JDBC
• MongoDB
• Redis
• Gemfire
• JMS (special channels defined in JMS namespace)
Types of message channels
• Pollable channels
• Buffer messages
• Poller is necessary
• Subscribable channels
• Call message handlers
Lubos Krnac „Pivotal Certified Spring Enterprise Integration Specialist Exam A Study Guide”, Apress, p. 350
Point-to-point channels
• Only one receiver
• DirectChannel
• Default
• Use sender’s thread
• Blocking
• Dispatcher can be configured
• QueueChannel
• Internal queue for messages
• Different threads (no transaction and security
context propagation)
• Not blocking
<int:channel id="directChannel"/>
<int:channel id="queueChannel">
<int:queue capacity="20"/>
</int:channel>
Point-to-point channels
• PriorityChannel
• Priority queue
• Use priority header
• Or custom comparator
• RendezvousChannel
• Use SynchronousQueue
• Sender knows that some receiver has accepted the message
• Request-reply operations
• ExecutorChannel
• Like DirectChannel
• Use TaskExecutor to dispatch – different thread
• NullChannel (disarded messages)
<int:channel id="rendezvousChannel">
<int:rendezvous-queue/>
</int:channel>
<int:channel id="priorityChannel">
<int:priority-queue capacity="10"/>
</int:channel>
<int:channel id="executorChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
Publish-subscribe
• Multiple receivers
• PublishSubscribeChannel – synchronous, using sender’s thread, default
• Parallel using TaskExecutor – different threads
<int:publish-subscribe-channel id="synchronousChannel"/>
<int:publish-subscribe-channel id="asynchronousChannel" task-executor="taskExecutor"/>
<task:executor id="taskExecutor" pool-size="10"/>
Publish-subscribe demo
Channel interceptors
• ChannelInterceptor interface
• Defined per channel
• Global
<int:channel id="testChannel">
<int:interceptors>
<ref bean="someCustomInterceptor"/>
</int:interceptors>
</int:channel>
<int:channel-interceptor ref="someCustomInterceptor" pattern="test*"/>
Wire tap
• Special type of interceptor
• Sends a message to another channel without affecting original flow
• Useful for monitoring and debugging
• Often combined with logging channel adapter
<int:channel id="testChannel">
<int:interceptors>
<int:wire-tap channel="logChannel"/>
</int:interceptors>
</int:channel>
<int:channel id="logChannel"/>
<int:logging-channel-adapter channel="logChannel" level="INFO" />
<int:wire-tap channel="logChannel" pattern="*"/>
Endpoints
Types of endpoints
• Messaging components
• Adapters (inbound and outbound) – covered in more detail later
• Gateways (inbound and outbound)
• Service Activator
• Message routing (filter, router, splitter, agregator, resequencer…)
• Message transformation (content enricher, claim check…)
• And much more…
Adapters
• One way integration
• Inbound
• Used to generate new messages with a poller (file system, Spring bean)
• Accept external input (JMS, HTTP)
• Outbound – send an event to an external system
<int:inbound-channel-adapter id="generator" channel="numbers" ref="numberGenerator" method="getRandomNumber">
<int:poller fixed-rate="1000"/>
</int:inbound-channel-adapter>
<int-jms:inbound-channel-adapter id="jmsIn" destination="queue" channel="testChannel">
<int:poller fixed-rate="1000"/>
</int-jms:inbound-channel-adapter>
Gateways
• Two way integration
• Inbound Gateway - deliver message into application and waits for a response
• Outbound Gateway - invokes external system and gets a response
• Categories
• Generic messaging gateway – proxy between Java code and Spring Integration infrastructure
• Technology-specific messaging gateways – handle communication with external systems (JDBS, JMS,
SOAP, HTTP)
Messaging gateway
• Proxy for sending messages from Java code
• Temporary reply channel created automatically
• Converts a parameter to a message payload
• May return Future (asynchronous) or void
public interface HRService {
Status doubleSalary(Person person);
}
<int:gateway id="hrService" service-interface="com.hr.HRService" default-request-channel="people" />
Service Activator
• Invoke bean method
• Return value becomes a message
• method attribute (or @ServiceActivator) if there are more methods
public class MessageProcessor {
Status process(Data data) {
…
}
}
<int:service-activator ref="messageProcessor" input-channel="input" output-channel="output"/>
<bean id="messageProcessor" class="test.MessageProcessor">
Demo: rest controller + gateway + JMS
Basic enterprise integration patterns
Bridge
• Connects two channels (pollable to subscribable channel)
• Connects two channel adapters
<int:bridge input-channel="inputChannel" output-channel="outputChannel">
<int:poller fixed-delay="1000"/>
</int:bridge>
Message transformer
• Payload conversion
• Header enriching
• Generic transformer
• Support for maps, XML, JSON…
<int:transformer input-channel="inputChannel" output-channel="outputChannel" expression="payload.toUpperCase()"/>
Filter
• Decides to allow message processing
• Default: drop message
• Exception on rejection
• Discard channel
<int:filter input-channel="inputChannel" output-channel="outputChannel"
ref="filterBean" method="filter"
discard-channel="invalidData"/>
Router
• Choose next channel
• Calls bean’s method and treats return value as channel name, other options available
• List of names
• Channel or list of channels
• Additional routers based on
• Payload type
• Header value
• Exception type
• SpEL
• Recipients list
• XPath
<int:router input-channel="inputChannel" ref="router" method="route"/>
Splitter
• Input – one message
• Output – many messages
<int:splitter input-channel="orders" output-channel="items" ref="orderSplitter" method="split"/>
List<LineItem> split(Order order) {
return order.getItems();
}
Adapters
Plenty of them…
• Files/FTP/FTPS/SFTP
• JDBC/JPA
• MongoDB
• Redis
• JMS/AMQP
• RSS
• HTTP/WebSockets/SOAP/RMI
• Mails
• MQTT
• Twitter
• That’s not all!
JDBC
• Could be used to retrieve or write data
• Backing Message Channels
<int-jdbc:inbound-channel-adapter query="select * from item where status=2"
channel="dataChannel" data-source="dataSource"
update="update item set status=10 where id in (:id)">
<int:poller fixed-rate="1000">
<int:transactional/>
</int:poller>
</int-jdbc:inbound-channel-adapter>
Files support
• AcceptOnceFileListFilter – default, in memory
• FileSystemPersistentAcceptOnceFileListFilter – use of MetadataStore
<int-file:inbound-channel-adapter id="filesIn1"
directory="file:${input.directory}" prevent-duplicates="true"/>
<int-file:inbound-channel-adapter id="filesIn2"
directory="file:${input.directory}"
filter="customFilterBean" />
<int-file:inbound-channel-adapter id="filesIn3"
directory="file:${input.directory}"
filename-pattern="test*" />
<int-file:inbound-channel-adapter id="filesIn4"
directory="file:${input.directory}"
filename-regex="test[0-9]+.txt" />
JMS
• Inbound/Outbound Channel Adapter
• Message-Driven Channel Adapter (uses MessageListener container)
• Inbound/Outbound Gateway
• JMS Backed Message Channels
Demo: JDBC in + JMS channel +splitter +
MongoDB out
Errors handling
Synchronous call (sender’s thread)
• Sender receives a MessageHandlingException
• It wraps original exception
• Exception is also returned for a bidirectionl asynchronous call
Unidirectional asynchronous call
• Message is sent to error channel
• Use of error channel header
• Use global channel named „errorChannel”
• errorChannel
• publish-subscribe
• Could be overriden
• exception-type-router
<int:exception-type-router input-channel="inputChannel"
default-output-channel="defaultChannel">
<int:mapping exception-type="java.lang.IllegalArgumentException"
channel="illegalChannel"/>
<int:mapping exception-type="java.lang.NullPointerException"
channel="npeChannel"/>
</int:exception-type-router>
Extras
Chaining endpoints
• Only last element can define output channel
• Intermediates steps have to return a message (or null)
• If last endpoint returns sth, output channel or replyChannel in a message have to be
defined
• Implicit use of direct channels - elements in a chain can’t be active
<int:chain input-channel="input" output-channel="output">
<int:filter ref="someSelector" throw-exception-on-rejection="true"/>
<int:header-enricher error-channel="customErrorChannel">
<header name="foo" value="bar"/>
</int:header-enricher>
<int:service-activator ref="someService" method="someMethod"/>
</int:chain>
Java Configuration/Annotations
• @Bean annotation do declare i.e. channels
• Component scanning: @MessageEndpoint, @ServiceActivator, @Filter, @Router etc.
@Bean
public MessageChannel channel() {
List<ChannelInterceptor> interceptors = /* ... */
final PublishSubscribeChannel channel = new PublishSubscribeChannel(executor());
channel.setInterceptors(interceptors);
return channel;
}
@Filter(inputChannel = "input", outputChannel = "output", discardChannel = "dropped")
public boolean filter(final String message) {
return message.startsWith("prefix");
}
Java DSL
• https://github.com/spring-projects/spring-integration-java-dsl
@Bean
public IntegrationFlow myFlow() {
return IntegrationFlows.from(this.integerMessageSource(), c ->
c.poller(Pollers.fixedRate(100)))
.channel(this.inputChannel())
.filter((Integer p) -> p > 0)
.transform(Object::toString)
.channel(MessageChannels.queue())
.get();
}
Testing
• Unit testing – nothing special
• Use of standard Spring support for integration testing
• MessagingTemplate to interact with SI
Demo: simple testing example
Questions?
Thanks for listening
Dominik Strzyżewski
dominik.strzyzewski@gmail.com
Examples: https://github.com/krzyzol/spring-integration-presentation/

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Introduction to RxJS
Introduction to RxJSIntroduction to RxJS
Introduction to RxJS
 
Spring Boot
Spring BootSpring Boot
Spring Boot
 
Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!Enterprise Integration Patterns with Spring integration!
Enterprise Integration Patterns with Spring integration!
 
Introduction to spring boot
Introduction to spring bootIntroduction to spring boot
Introduction to spring boot
 
RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)
 
Open Closed Principle kata
Open Closed Principle kataOpen Closed Principle kata
Open Closed Principle kata
 
Angular 4 and TypeScript
Angular 4 and TypeScriptAngular 4 and TypeScript
Angular 4 and TypeScript
 
Spring Boot in Action
Spring Boot in Action Spring Boot in Action
Spring Boot in Action
 
Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8Pragmatic functional refactoring with java 8
Pragmatic functional refactoring with java 8
 
Building resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with SpringBuilding resilient scheduling in distributed systems with Spring
Building resilient scheduling in distributed systems with Spring
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
DevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdfDevOps Sonatype Nexus Demo_2023.pdf
DevOps Sonatype Nexus Demo_2023.pdf
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Enteprise Integration Patterns
Enteprise Integration PatternsEnteprise Integration Patterns
Enteprise Integration Patterns
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
Spring Data JPA
Spring Data JPASpring Data JPA
Spring Data JPA
 
Functional Application Logging : Code Examples Using Spring Boot and Logback
Functional Application Logging : Code Examples Using Spring Boot and LogbackFunctional Application Logging : Code Examples Using Spring Boot and Logback
Functional Application Logging : Code Examples Using Spring Boot and Logback
 
Hexagonal architecture for java applications
Hexagonal architecture for java applicationsHexagonal architecture for java applications
Hexagonal architecture for java applications
 
Spring boot introduction
Spring boot introductionSpring boot introduction
Spring boot introduction
 

Andere mochten auch

Mule ESB
Mule ESBMule ESB
Mule ESB
niravn
 

Andere mochten auch (11)

Spring Integration
Spring IntegrationSpring Integration
Spring Integration
 
Spring Integration and EIP Introduction
Spring Integration and EIP IntroductionSpring Integration and EIP Introduction
Spring Integration and EIP Introduction
 
Spring integration
Spring integrationSpring integration
Spring integration
 
Workshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring IntegrationWorkshop Spring - Session 5 - Spring Integration
Workshop Spring - Session 5 - Spring Integration
 
Atlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring IntegrationAtlanta JUG - Integrating Spring Batch and Spring Integration
Atlanta JUG - Integrating Spring Batch and Spring Integration
 
S2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring BatchS2GX 2012 - Introduction to Spring Integration and Spring Batch
S2GX 2012 - Introduction to Spring Integration and Spring Batch
 
Mule ESB
Mule ESBMule ESB
Mule ESB
 
Wso2 esb
Wso2 esbWso2 esb
Wso2 esb
 
Mulesoft ppt
Mulesoft pptMulesoft ppt
Mulesoft ppt
 
The Technical SEO Renaissance
The Technical SEO RenaissanceThe Technical SEO Renaissance
The Technical SEO Renaissance
 
fabric8 ... and Docker, Kubernetes & OpenShift
fabric8 ... and Docker, Kubernetes & OpenShiftfabric8 ... and Docker, Kubernetes & OpenShift
fabric8 ... and Docker, Kubernetes & OpenShift
 

Ähnlich wie Spring integration

Ähnlich wie Spring integration (20)

Red Hat Open Day JBoss Fuse
Red Hat Open Day JBoss FuseRed Hat Open Day JBoss Fuse
Red Hat Open Day JBoss Fuse
 
Global Scale ESB with Mule
Global Scale ESB with MuleGlobal Scale ESB with Mule
Global Scale ESB with Mule
 
An introduction to Apache Camel
An introduction to Apache CamelAn introduction to Apache Camel
An introduction to Apache Camel
 
Windows 8 Metro apps and the outside world
Windows 8 Metro apps and the outside worldWindows 8 Metro apps and the outside world
Windows 8 Metro apps and the outside world
 
Sprintintegration ajip
Sprintintegration ajipSprintintegration ajip
Sprintintegration ajip
 
EIP In Practice
EIP In PracticeEIP In Practice
EIP In Practice
 
Mule enterprise service bus
Mule enterprise service busMule enterprise service bus
Mule enterprise service bus
 
Servlet.ppt
Servlet.pptServlet.ppt
Servlet.ppt
 
Servlet.ppt
Servlet.pptServlet.ppt
Servlet.ppt
 
Servlet1.ppt
Servlet1.pptServlet1.ppt
Servlet1.ppt
 
Adding Support for Networking and Web Technologies to an Embedded System
Adding Support for Networking and Web Technologies to an Embedded SystemAdding Support for Networking and Web Technologies to an Embedded System
Adding Support for Networking and Web Technologies to an Embedded System
 
Mule overview
Mule overviewMule overview
Mule overview
 
Mule Overview
Mule OverviewMule Overview
Mule Overview
 
Mule overview
Mule overviewMule overview
Mule overview
 
signalr
signalrsignalr
signalr
 
Building RESTfull Data Services with WebAPI
Building RESTfull Data Services with WebAPIBuilding RESTfull Data Services with WebAPI
Building RESTfull Data Services with WebAPI
 
Windows 8 Apps and the Outside World
Windows 8 Apps and the Outside WorldWindows 8 Apps and the Outside World
Windows 8 Apps and the Outside World
 
Overview of Mule
Overview of MuleOverview of Mule
Overview of Mule
 
(ATS6-PLAT04) Query service
(ATS6-PLAT04) Query service (ATS6-PLAT04) Query service
(ATS6-PLAT04) Query service
 
Debugging the Web with Fiddler
Debugging the Web with FiddlerDebugging the Web with Fiddler
Debugging the Web with Fiddler
 

Kürzlich hochgeladen

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
masabamasaba
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
masabamasaba
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
masabamasaba
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
masabamasaba
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
VictoriaMetrics
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
masabamasaba
 

Kürzlich hochgeladen (20)

%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open SourceWSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
WSO2CON 2024 - Freedom First—Unleashing Developer Potential with Open Source
 
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni%in Benoni+277-882-255-28 abortion pills for sale in Benoni
%in Benoni+277-882-255-28 abortion pills for sale in Benoni
 
AI & Machine Learning Presentation Template
AI & Machine Learning Presentation TemplateAI & Machine Learning Presentation Template
AI & Machine Learning Presentation Template
 
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Knoxville Psychic Readings, Attraction spells,Br...
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
WSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - KeynoteWSO2Con204 - Hard Rock Presentation - Keynote
WSO2Con204 - Hard Rock Presentation - Keynote
 
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
OpenChain - The Ramifications of ISO/IEC 5230 and ISO/IEC 18974 for Legal Pro...
 
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Toronto Psychic Readings, Attraction spells,Brin...
 
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
Large-scale Logging Made Easy: Meetup at Deutsche Bank 2024
 
Architecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the pastArchitecture decision records - How not to get lost in the past
Architecture decision records - How not to get lost in the past
 
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
WSO2CON 2024 - API Management Usage at La Poste and Its Impact on Business an...
 
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
%in Rustenburg+277-882-255-28 abortion pills for sale in Rustenburg
 
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park %in kempton park+277-882-255-28 abortion pills for sale in kempton park
%in kempton park+277-882-255-28 abortion pills for sale in kempton park
 
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
WSO2CON 2024 - Building the API First Enterprise – Running an API Program, fr...
 
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
%in kaalfontein+277-882-255-28 abortion pills for sale in kaalfontein
 
%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto%in Soweto+277-882-255-28 abortion pills for sale in soweto
%in Soweto+277-882-255-28 abortion pills for sale in soweto
 
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
%+27788225528 love spells in Huntington Beach Psychic Readings, Attraction sp...
 

Spring integration

  • 1.
  • 2. Introduction to Spring Integration Katowice, 04.02.2016 Dominik Strzyżewski
  • 3. Logistics • Around 2-2.5 hours • On site presentation & webinar • Questions at the end
  • 4. Agenda • High-level view • Anatomy of an message and types of channels • Endpoints • Basic enterprise integration patterns • Adapters • Errors handling • Extras *
  • 6. Main concepts • Components can communicate using in-memory messaging • Adapters to integrate with external systems • Use of Spring framework programming model • Based on Enterprise Integration Patterns book • http://projects.spring.io/spring-integration
  • 8. Adapters • Application components are separated from integration details • External systems (file system, JMS) can produce new message • Implementation details not important for components • Payload is important! (and metadata) • Spring Integration message can create an external event (SOAP, JDBC) http://www.javacodegeeks.com/2015/09/spring-integration-fundamentals.html
  • 10. Benefits • Loose coupling • Separation of concerns • EDA
  • 11. Competitors • Apache Camel • ESB: • Mule ESB • Apache ServiceMix • Red Hat Fuse ESB • IBM WebSphere ESB • Oracle Enterprise Service Bus • TIBCO ESB http://www.infoq.com/articles/ESB-Integration
  • 12. Anatomy of an message and types of channels
  • 13. Basic interaction • An endpoint sends a message • Endpoints are connected using MessageChannels • Endpoints can receive messages from channels by: • Subscribing (passive) • Polling (active)
  • 14. Message • Messages are immutable • GenericMessage • MessageBuilder • Payload is a Java object • Headers: • Predefined – always present • Predefined – specific for each component/adapter • Custom • From Spring 4: spring-messaging module
  • 15. Message channel • Connects endpoints • No persistence (in-memory) • Can be backed by messages store: • JDBC • MongoDB • Redis • Gemfire • JMS (special channels defined in JMS namespace)
  • 16. Types of message channels • Pollable channels • Buffer messages • Poller is necessary • Subscribable channels • Call message handlers Lubos Krnac „Pivotal Certified Spring Enterprise Integration Specialist Exam A Study Guide”, Apress, p. 350
  • 17. Point-to-point channels • Only one receiver • DirectChannel • Default • Use sender’s thread • Blocking • Dispatcher can be configured • QueueChannel • Internal queue for messages • Different threads (no transaction and security context propagation) • Not blocking <int:channel id="directChannel"/> <int:channel id="queueChannel"> <int:queue capacity="20"/> </int:channel>
  • 18. Point-to-point channels • PriorityChannel • Priority queue • Use priority header • Or custom comparator • RendezvousChannel • Use SynchronousQueue • Sender knows that some receiver has accepted the message • Request-reply operations • ExecutorChannel • Like DirectChannel • Use TaskExecutor to dispatch – different thread • NullChannel (disarded messages) <int:channel id="rendezvousChannel"> <int:rendezvous-queue/> </int:channel> <int:channel id="priorityChannel"> <int:priority-queue capacity="10"/> </int:channel> <int:channel id="executorChannel"> <int:dispatcher task-executor="taskExecutor"/> </int:channel>
  • 19. Publish-subscribe • Multiple receivers • PublishSubscribeChannel – synchronous, using sender’s thread, default • Parallel using TaskExecutor – different threads <int:publish-subscribe-channel id="synchronousChannel"/> <int:publish-subscribe-channel id="asynchronousChannel" task-executor="taskExecutor"/> <task:executor id="taskExecutor" pool-size="10"/>
  • 21. Channel interceptors • ChannelInterceptor interface • Defined per channel • Global <int:channel id="testChannel"> <int:interceptors> <ref bean="someCustomInterceptor"/> </int:interceptors> </int:channel> <int:channel-interceptor ref="someCustomInterceptor" pattern="test*"/>
  • 22. Wire tap • Special type of interceptor • Sends a message to another channel without affecting original flow • Useful for monitoring and debugging • Often combined with logging channel adapter <int:channel id="testChannel"> <int:interceptors> <int:wire-tap channel="logChannel"/> </int:interceptors> </int:channel> <int:channel id="logChannel"/> <int:logging-channel-adapter channel="logChannel" level="INFO" /> <int:wire-tap channel="logChannel" pattern="*"/>
  • 24. Types of endpoints • Messaging components • Adapters (inbound and outbound) – covered in more detail later • Gateways (inbound and outbound) • Service Activator • Message routing (filter, router, splitter, agregator, resequencer…) • Message transformation (content enricher, claim check…) • And much more…
  • 25. Adapters • One way integration • Inbound • Used to generate new messages with a poller (file system, Spring bean) • Accept external input (JMS, HTTP) • Outbound – send an event to an external system <int:inbound-channel-adapter id="generator" channel="numbers" ref="numberGenerator" method="getRandomNumber"> <int:poller fixed-rate="1000"/> </int:inbound-channel-adapter> <int-jms:inbound-channel-adapter id="jmsIn" destination="queue" channel="testChannel"> <int:poller fixed-rate="1000"/> </int-jms:inbound-channel-adapter>
  • 26. Gateways • Two way integration • Inbound Gateway - deliver message into application and waits for a response • Outbound Gateway - invokes external system and gets a response • Categories • Generic messaging gateway – proxy between Java code and Spring Integration infrastructure • Technology-specific messaging gateways – handle communication with external systems (JDBS, JMS, SOAP, HTTP)
  • 27. Messaging gateway • Proxy for sending messages from Java code • Temporary reply channel created automatically • Converts a parameter to a message payload • May return Future (asynchronous) or void public interface HRService { Status doubleSalary(Person person); } <int:gateway id="hrService" service-interface="com.hr.HRService" default-request-channel="people" />
  • 28. Service Activator • Invoke bean method • Return value becomes a message • method attribute (or @ServiceActivator) if there are more methods public class MessageProcessor { Status process(Data data) { … } } <int:service-activator ref="messageProcessor" input-channel="input" output-channel="output"/> <bean id="messageProcessor" class="test.MessageProcessor">
  • 29. Demo: rest controller + gateway + JMS
  • 31. Bridge • Connects two channels (pollable to subscribable channel) • Connects two channel adapters <int:bridge input-channel="inputChannel" output-channel="outputChannel"> <int:poller fixed-delay="1000"/> </int:bridge>
  • 32. Message transformer • Payload conversion • Header enriching • Generic transformer • Support for maps, XML, JSON… <int:transformer input-channel="inputChannel" output-channel="outputChannel" expression="payload.toUpperCase()"/>
  • 33. Filter • Decides to allow message processing • Default: drop message • Exception on rejection • Discard channel <int:filter input-channel="inputChannel" output-channel="outputChannel" ref="filterBean" method="filter" discard-channel="invalidData"/>
  • 34. Router • Choose next channel • Calls bean’s method and treats return value as channel name, other options available • List of names • Channel or list of channels • Additional routers based on • Payload type • Header value • Exception type • SpEL • Recipients list • XPath <int:router input-channel="inputChannel" ref="router" method="route"/>
  • 35. Splitter • Input – one message • Output – many messages <int:splitter input-channel="orders" output-channel="items" ref="orderSplitter" method="split"/> List<LineItem> split(Order order) { return order.getItems(); }
  • 37. Plenty of them… • Files/FTP/FTPS/SFTP • JDBC/JPA • MongoDB • Redis • JMS/AMQP • RSS • HTTP/WebSockets/SOAP/RMI • Mails • MQTT • Twitter • That’s not all!
  • 38. JDBC • Could be used to retrieve or write data • Backing Message Channels <int-jdbc:inbound-channel-adapter query="select * from item where status=2" channel="dataChannel" data-source="dataSource" update="update item set status=10 where id in (:id)"> <int:poller fixed-rate="1000"> <int:transactional/> </int:poller> </int-jdbc:inbound-channel-adapter>
  • 39. Files support • AcceptOnceFileListFilter – default, in memory • FileSystemPersistentAcceptOnceFileListFilter – use of MetadataStore <int-file:inbound-channel-adapter id="filesIn1" directory="file:${input.directory}" prevent-duplicates="true"/> <int-file:inbound-channel-adapter id="filesIn2" directory="file:${input.directory}" filter="customFilterBean" /> <int-file:inbound-channel-adapter id="filesIn3" directory="file:${input.directory}" filename-pattern="test*" /> <int-file:inbound-channel-adapter id="filesIn4" directory="file:${input.directory}" filename-regex="test[0-9]+.txt" />
  • 40. JMS • Inbound/Outbound Channel Adapter • Message-Driven Channel Adapter (uses MessageListener container) • Inbound/Outbound Gateway • JMS Backed Message Channels
  • 41. Demo: JDBC in + JMS channel +splitter + MongoDB out
  • 43. Synchronous call (sender’s thread) • Sender receives a MessageHandlingException • It wraps original exception • Exception is also returned for a bidirectionl asynchronous call
  • 44. Unidirectional asynchronous call • Message is sent to error channel • Use of error channel header • Use global channel named „errorChannel” • errorChannel • publish-subscribe • Could be overriden • exception-type-router <int:exception-type-router input-channel="inputChannel" default-output-channel="defaultChannel"> <int:mapping exception-type="java.lang.IllegalArgumentException" channel="illegalChannel"/> <int:mapping exception-type="java.lang.NullPointerException" channel="npeChannel"/> </int:exception-type-router>
  • 46. Chaining endpoints • Only last element can define output channel • Intermediates steps have to return a message (or null) • If last endpoint returns sth, output channel or replyChannel in a message have to be defined • Implicit use of direct channels - elements in a chain can’t be active <int:chain input-channel="input" output-channel="output"> <int:filter ref="someSelector" throw-exception-on-rejection="true"/> <int:header-enricher error-channel="customErrorChannel"> <header name="foo" value="bar"/> </int:header-enricher> <int:service-activator ref="someService" method="someMethod"/> </int:chain>
  • 47. Java Configuration/Annotations • @Bean annotation do declare i.e. channels • Component scanning: @MessageEndpoint, @ServiceActivator, @Filter, @Router etc. @Bean public MessageChannel channel() { List<ChannelInterceptor> interceptors = /* ... */ final PublishSubscribeChannel channel = new PublishSubscribeChannel(executor()); channel.setInterceptors(interceptors); return channel; } @Filter(inputChannel = "input", outputChannel = "output", discardChannel = "dropped") public boolean filter(final String message) { return message.startsWith("prefix"); }
  • 48. Java DSL • https://github.com/spring-projects/spring-integration-java-dsl @Bean public IntegrationFlow myFlow() { return IntegrationFlows.from(this.integerMessageSource(), c -> c.poller(Pollers.fixedRate(100))) .channel(this.inputChannel()) .filter((Integer p) -> p > 0) .transform(Object::toString) .channel(MessageChannels.queue()) .get(); }
  • 49. Testing • Unit testing – nothing special • Use of standard Spring support for integration testing • MessagingTemplate to interact with SI
  • 52. Thanks for listening Dominik Strzyżewski dominik.strzyzewski@gmail.com Examples: https://github.com/krzyzol/spring-integration-presentation/