Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
We take care of it - personally!
© 2013 innoQ Deutschland GmbH
Flexible EAI-Lösungen mit GlassfishPraxisbeispiele und War Stories zu EAI-Pattern
Alexander Heusingfeld, @goldstiftMartin Huber, @waterback
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Multitude of potential service consumers
Integration is ubiquitous
CRMApplication
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Multitude of potential service consumers
Integration is ubiquitous
CRMApplication
ERPApplication
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Multitude of potential service consumers
Integration is ubiquitous
CRMApplication?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Multitude of potential service consumers
Integration is ubiquitous
CRMApplication
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Patterns? Wasn’t there a book? Design Patterns (Gamma et al), 1994
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Patterns? Wasn’t there a book? Design Patterns (Gamma et al), 1994
Proven solutions for common problems
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Patterns? Wasn’t there a book? Design Patterns (Gamma et al), 1994
Proven solutions for common problems
Enterprise Integration Patterns (Hohpe & Woolf), 2003
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Patterns? Wasn’t there a book? Design Patterns (Gamma et al), 1994
Proven solutions for common problems
Enterprise Integration Patterns (Hohpe & Woolf), 2003
Swiss-army knife for asynchronous messaging
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Patterns? Wasn’t there a book? Design Patterns (Gamma et al), 1994
Proven solutions for common problems
Enterprise Integration Patterns (Hohpe & Woolf), 2003
Swiss-army knife for asynchronous messaging
www.eaipatterns.com
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
“We all believe that asynchronous messaging carries the greatest promise.”
- Martin Fowler (Foreword of Enterprise Integration Patterns, 2003)
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
MESSAGING?
http://bit.ly/PtrhWy
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Benefits of async. Messaging
decoupled
integrated platforms/ languages
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Benefits of async. Messaging
decoupled
integrated platforms/ languages
reliable communication
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Benefits of async. Messaging
decoupled
integrated platforms/ languages
reliable communication
disconnected
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Benefits of async. Messaging
decoupled
integrated platforms/ languages
reliable communication
disconnected
throttled
Tuesday 8 October 13
We take care of it - personally!
© 2013 innoQ Deutschland GmbH
But why those Patterns?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Thoughts on EAI patterns
not invented, but observed
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Thoughts on EAI patterns
not invented, but observed
don’t solve everything
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Thoughts on EAI patterns
not invented, but observed
don’t solve everything
provide ideas
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Thoughts on EAI patterns
not invented, but observed
don’t solve everything
provide ideas
good ones evolve
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Thoughts on EAI patterns
not invented, but observed
don’t solve everything
provide ideas
good ones evolve
changes are incorporated at eaipatterns.com
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Simple order management system (CRUD)
Real Life Scenario
ordermanagement
system
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Simple order management system (CRUD)
Real Life Scenario
ordermanagement
system
• basic Java EE
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Simple order management system (CRUD)
Real Life Scenario
ordermanagement
system
• basic Java EE• Just CRUD operations
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Simple order management system (CRUD)
Real Life Scenario
ordermanagement
system
• basic Java EE• Just CRUD operations• “information silo”
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Simple order management system (CRUD)
Real Life Scenario
ordermanagement
system
• basic Java EE• Just CRUD operations• “information silo”
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Enhance the system with an importer!
Simple Change
ordermanagement
system
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Enhance the system with an importer!
Simple Change
• Receive CSV-data via HTTP POST
ordermanagement
system
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Enhance the system with an importer!
Simple Change
• Receive CSV-data via HTTP POST• CSV contains header and detail records
ordermanagement
system
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Enhance the system with an importer!
Simple Change
• Receive CSV-data via HTTP POST• CSV contains header and detail records• Import data into database
ordermanagement
system
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
A Simple Java EE sample@WebServlet(urlPatterns = {"/order/import"})public class ImporterServlet extends HttpServlet { @Inject OrderBean bean; @Inject CsvDataParser parser;
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("csvdata"); List<Order> orders = parser.transform(data); for (Order order : orders) { bean.persist(order); } }}
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Enhanced the system with an importer!
System
Simple Change done
ordermanagement
systemHTTP
csv
Tran
sfor
m
Business Partner
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Integrate the system of a forwarder
System
Change happens
ordermanagement
systemHTTP
csvTr
ansf
orm
Business Partner
forwardersystem
FTP
SMTP
SOAP WSSEREST
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Recognize an integration task
when it‘s staring in your face?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
EASY!
http
://w
ww
.flic
kr.c
om/p
hoto
s/w
espi
onag
e/18
4793
114
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Build an easy and maintainable solution
for multiple integration challenges?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
NO PROBLEM!
http
://w
ww
.flic
kr.c
om/p
hoto
s/m
roac
h/39
2290
3520
/
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Something wrong here?@WebServlet(urlPatterns = {"/order/import"})public class ImporterServlet extends HttpServlet { @Inject OrderBean bean; @Inject CsvDataParser parser;
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("csvdata"); List<Order> orders = parser.transform(data); for (Order order : orders) { bean.persist(order); } }}
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Something wrong here?@WebServlet(urlPatterns = {"/order/import"})public class ImporterServlet extends HttpServlet { @Inject OrderBean bean; @Inject CsvDataParser parser;
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("csvdata"); List<Order> orders = parser.transform(data); for (Order order : orders) { bean.persist(order); } }}
testable?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Something wrong here?@WebServlet(urlPatterns = {"/order/import"})public class ImporterServlet extends HttpServlet { @Inject OrderBean bean; @Inject CsvDataParser parser;
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("csvdata"); List<Order> orders = parser.transform(data); for (Order order : orders) { bean.persist(order); } }}
testable?reusable?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Something wrong here?@WebServlet(urlPatterns = {"/order/import"})public class ImporterServlet extends HttpServlet { @Inject OrderBean bean; @Inject CsvDataParser parser;
@Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String data = request.getParameter("csvdata"); List<Order> orders = parser.transform(data); for (Order order : orders) { bean.persist(order); } }}
testable?reusable?
extensible?
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Pipes and Filtershttp://www.enterpriseintegrationpatterns.com/PipesAndFilters.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Pipes and Filtersdivide your task into small steps
http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
RoutePipe
Apply pipes & filters pattern
Pipeoutboundtransforminbound
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
RoutePipe
Apply pipes & filters pattern
Pipeoutboundtransforminbound
Servlet
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
RoutePipe
Apply pipes & filters pattern
Pipeoutboundtransforminbound
Servlet Custom
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
RoutePipe
Apply pipes & filters pattern
Pipeoutboundtransforminbound
Servlet Custom JPA
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
INFALLIBLE!
http
://w
ww
.flic
kr.c
om/p
hoto
s/oh
skyl
ab/4
5476
9350
2
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
ADAPTERS?
http
://w
ww
.flic
kr.c
om/p
hoto
s/m
roac
h/39
2290
3520
/Pr
oper
ty o
f Chi
nBuy
e Li
mite
d. h
ttp://
bit.l
y/xB
KwGw
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
A simple camel route
from("jetty:http://localhost:9080/order/import") .routeId(“orderimport”) .process(new PostParameterProcessor(“csvdata”)) .process(new StringRemover(new String[]{"\""})) .unmarshal().csv() .split(body(List.class)) .aggregate(header("orderId"), new MySpecialAggregationStrategy()).completionTimeout(3000) .to("seda:singlepartsroute");
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Spring Integration sample<int-http:inbound-channel-adapter ! id="orderImportHttpAdapter"! path="/order/import” supported-methods="POST"! channel="ordersIn"/>
<int:channel="ordersIn"/>
<int:splitter input-channel="ordersIn" ref="orderSplitter" method="split" output-channel="ordersToDB" /><bean id="orderSplitter" class="com.innoq.samples.eai.OrderSplitter"/>
<int:channel="ordersToDB"/>
<int-jpa:updating-outbound-gateway request-channel="ordersToDB" entity-class="com.innoq.samples.eai.domain.Order" entity-manager="em"/>
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Admin UI
Real-life scenario: Control Bus
xml-route-config
EAI-Node
EAI-Node
EAI-Nodectrl-queue
TomcatEmbedded Jetty
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Real-life scenario: Control Bus
xml-route-config
EAI-Node
database connection
EAI-Node
EAI-Nodectrl-queue
Initial Node configuration
node type (command line arg)
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Real-life scenario: Control Bus
xml-route-config
EAI-Node
subscribe to control queue
EAI-Node
EAI-Nodectrl-queue
1. Server startup
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Real-life scenario: Control Bus
xml-route-config
EAI-Node
load node-type specific config
EAI-Node
EAI-Nodectrl-queue
subscribe to control queue
1. Server startup
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Config change @Runtime
xml-route-config
EAI-Node
EAI-Node
EAI-Nodectrl-queue
2. during runtimeroute config is changed
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Config change @Runtime
xml-route-config
EAI-Node
EAI-Node
EAI-Nodectrl-queue
2. during runtimeroute config is changed
publish config update message
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Config change @Runtime
xml-route-config
EAI-Node
interpret relevance of control message
EAI-Node
EAI-Nodectrl-queue
3. upon control message arrival
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Config change @Runtime
xml-route-config
EAI-Node
affected nodes reload configuration
EAI-Node
EAI-Nodectrl-queue
interpret relevance of control message
3. upon control message arrival
Admin UI
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
OracleDB + AQ
Admin UI
What would we change today?
xml-route-config
EAI-Node
EAI-Node
EAI-Nodectrl-queue
GlassFish 4.0
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Routerhttp://www.enterpriseintegrationpatterns.com/MessageRouter.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Routerforward by condition
http://www.enterpriseintegrationpatterns.com/MessageRouter.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Routerhttp://www.enterpriseintegrationpatterns.com/MessageRouter.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Router
from(“ibmmq:QUEUE.IN“).noAutoStartup() .transacted() .policy(required) .routeId(BasicRouteBuilder.stdfromRouteId(this.componentBaseName)) .process(vslHeadersProcessor) .setHeader(HDR_DUMMYCOMPLCHK_IBR, constant(PASSEDMSG)) .bean(inboundTargetDispatcherBean) .wireTap("seda:inboundRouter.log");
Apache Camel running in WAS6.1
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Router
from(“ibmmq:QUEUE.IN“).noAutoStartup() .transacted() .policy(required) .routeId(BasicRouteBuilder.stdfromRouteId(this.componentBaseName)) .process(vslHeadersProcessor) .setHeader(HDR_DUMMYCOMPLCHK_IBR, constant(PASSEDMSG)) .bean(inboundTargetDispatcherBean) .wireTap("seda:inboundRouter.log");
Apache Camel running in WAS6.1
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Message Routerhttp://www.eaipatterns.com
/MessageRouter.html
public class InboundTargetMsgDispatcherBean implements Constants {
/** * Map for all eligible Target Endpoints of the InboundRouter. */ private final Map<String, String[]> allTargets = new HashMap<String, String[]>(NROFROUTES);
...
@RecipientList public String[] route(@Header(HDR_JMSX_GROUPID) String group) { String[] t = allTargets.get(group); return t; }
/** * creates valid endpoint-uris from targetJMSUri and numbering. */ private void createAllTargets() { if (allTargets.keySet().size() == 0) { for (int i = 0; i < NROFROUTES; i++) { String target = createTargetJMSUri(i); allTargets.put(String.valueOf(i), new String[] { target }); } } }
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformerwww.enterpriseintegrationpatterns.com/MessageTransformationIntro.html
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (2)
from(“http://localhost:8080/authservice/proxy/transformed?bridgeEndpoint=true“) .routeId("bankapp.transformation.dispatch." + identification) .choice() .when().xpath("//v10:*[1]", inputNS) .to("direct:transform_v10_v11“) .otherwise() .to(outputEndpoint) .endChoice();
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (2)
from(“http://localhost:8080/authservice/proxy/transformed?bridgeEndpoint=true“) .routeId("bankapp.transformation.dispatch." + identification) .choice() .when().xpath("//v10:*[1]", inputNS) .to("direct:transform_v10_v11“) .otherwise() .to(“http://localhost:8380/routingservice/proxy/” + “BPMNSystemSpecEP?bridgeEndpoint=true“) .endChoice();
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (2)
from(“http://localhost:8080/authservice/proxy/transformed?bridgeEndpoint=true“) .routeId("bankapp.transformation.dispatch." + identification) .choice() .when().xpath("//v10:*[1]", inputNS) .to("direct:transform_v10_v11“) .otherwise() .to(“http://localhost:8380/routingservice/proxy/” + “BPMNSystemSpecEP?bridgeEndpoint=true“) .endChoice();
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (2)
from(“http://localhost:8080/authservice/proxy/transformed?bridgeEndpoint=true“) .routeId("bankapp.transformation.dispatch." + identification) .choice() .when().xpath("//v10:*[1]", inputNS) .to("direct:transform_v10_v11“) .otherwise() .to(“http://localhost:8380/routingservice/proxy/” + “BPMNSystemSpecEP?bridgeEndpoint=true“) .endChoice();
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(“http://localhost:8380/routingservice/proxy/BPMNSystemSpecEP?“+ „bridgeEndpoint=true“) .to("direct:response" + reverseidentification);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(outputEndpoint) .to("direct:response" + reverseidentification);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(outputEndpoint) .to("direct:response" + reverseidentification);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(outputEndpoint) .to("direct:response" + reverseidentification);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)from("direct:transform_v10_v11") .routeId("projectX.route.transformation.transform." + identification) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_" + identification + ".xsl") .bean(transformerBean, "transform_v10_v11")...
public class BankTransformerBean extends AbstractTransformerBean {
@SuppressWarnings({ "rawtypes" }) public String transform_v10_v11(@Body String body) throws JDOMException, IOException { Element message = parse(body); message.removeNamespaceDeclaration(nsXBANK_v1_0); message.removeNamespaceDeclaration(nsYBANK_v1_0); message.addNamespaceDeclaration(nsXBANKv1_1);
.... return toString(message); } @SuppressWarnings({ "rawtypes" }) public String transform_v11_v10(@Body String body) throws JDOMException, IOException {
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(“http://localhost:8380/routingservice/proxy/BPMNSystemSpecEP?“+ „bridgeEndpoint=true“) .to("direct:response_v11_v10“);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (3)
from(“direct:transform_v10_v11“) .routeId("projectX.route.transformation.transform.v10_v11“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v10_v11.xsl") .bean(XBankTransformerBean, "transform_v10_v11") .setBody().simple(TransformationConstants.soapStart +"$ {in.body}"+TransformationConstants.soapEnd) .process(new ContentPrinter("v10-v11“)) .inOut(“http://localhost:8380/routingservice/proxy/BPMNSystemSpecEP?“+ „bridgeEndpoint=true“) .to("direct:response_v11_v10“);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Transformation für BPMN-System (4)
from("direct:response_v11_v10“) .setBody().xpath("/s:Envelope/s:Body/*[1]", soapNS) .to("xslt:xsl/BankX/Bank_v11_v10.xsl") .bean(transformerBean, "transform_v11_v10") .setBody().simple(TransformationConstants.soapStartTixBank +"${in.body}" +TransformationConstants.soapEnd);
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
RoutePipe
Flexibility through Filters
Pipeoutboundfilterinbound
Filters are exchangeable, reusable and easily testable
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Should I always use an EAI-Framework?
It depends!
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Further tips considering EAI
small building blocks
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Further tips considering EAI
small building blocks
no shared mutable state
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Further tips considering EAI
small building blocks
no shared mutable state
use immutable DTOs
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Further tips considering EAI
small building blocks
no shared mutable state
use immutable DTOs
=> increased scalability
Tuesday 8 October 13
© 2013 innoQ Deutschland GmbH
Further tips considering EAI
small building blocks
no shared mutable state
use immutable DTOs
=> increased scalability
advanced: see “SEDA” & “actor model”
Tuesday 8 October 13
We take care of it - personally!
© 2013 innoQ Deutschland GmbH
Alexander Heusingfeld, @goldstift
Martin Huber, @waterback
http://www.innoq.com/de/talks
Vielen Dank!
Tuesday 8 October 13