Apache ServiceMix 4.0
The Next Generation ESB
Guillaume Nodet
About the author
Guillaume Nodet
Open Source
PMC Chair of the Apache ServiceMix project Involved in Apache Geronimo, Apache ActiveMQ, Apache ODE, Apache CXF, Jencks Previously involved in XFire, Mule
IONA Principal Engineer
Since LogicBlaze acquisition in April 2007
Schedule
JBI 1.0
Overview Architecture
Building blocks
OSGi as a platform Spring for configuration Intuitive EIP router High performance message broker Easy to use Services Framework
WSDL Messaging Model
Normalized Message Router Lessons learned
Apache ServiceMix 4.0
Goal Standard based Simplified API
Around the container
Eclipse tooling
Long term
JBI 2.0, SCA
Demo
JBI 1.0: what is JBI?
Integration Systems Plug-in Components Normalized exchanges WSDL Decoupling
JBI 1.0: architecture
JBI 1.0: WSDL messaging model
Abstract model Concrete model
Service providers Service consumers
JBI 1.0: WSDL messaging model
Abstract model
Message type
Normal Faults
Operation
Qualified name Message Exchange Pattern Message types
Interface
Qualified name Operations Extended interfaces
JBI 1.0: WSDL messaging model
Concrete model
Binding type Endpoint
Endpoint name Binding type
Service
Qualified name Interface name Endpoints
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Activation Service invocation and MEPs Message Exchange Endpoints
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Consumers and Activation Service invocationWSDL description and MEPs Abstract model Message Exchange Endpoints Decoupled
providers
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Normalized Activation Service invocationXML payload and MEPs Properties Message Exchange Endpoints Attachments
Message
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Delivery Channel Activation Service invocationCommunication between a and MEPs component and the NMR Message Exchange Endpoints
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Endpoint activation Activation Service invocationDeclaring Service endpoint and MEPs Providing metadata Message Exchange Endpoints
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Service invocation Activation Service invocationIn-Only and MEPs Robust-In-Only Message Exchange Endpoints In-Out
and MEP
In-Optional-Out
JBI 1.0: Normalized Message Router
Consumers and providers Normalized Message Delivery Channel Run-time Endpoint Endpoints Activation Service invocationExternal and MEPs Internal Message Exchange Addressing Endpoints
Implicit Explicit Dynamic
JBI 1.0: Lessons learned
Pros
Normalized exchanges Normalized Message Router
Cons
Classloader architecture JBI packaging Writing components is complex Role of the component ?
ServiceMix 4.0: Goal
Enterprise OSGi Container Lightweight ESB and SOA container Ease of use
ServiceMix 4.0: Standard based
Short Term
JBI 1.0
On the long term
JBI 2.0 support SCA
JAX-WS, WS-*
IONA Support
Involved in JBI 2.0 EG, OSGi Alliance (leading OSGi Enterprise Edition EG), SCA
ServiceMix 4.0: Simplified API
No more components
Deployment / Classloader is delegated to OSGi
Bundles as the packaging and extension mechanism
Leverages OSGi architecture Leverage spring-osgi (optionally)
Endpoints as first-class citizens
Endpoint are activated when registered in the OSGi registry Channel is now on the Endpoint Endpoints use push delivery rather than pulling the channel
Building blocks
Avoid reinventing the wheel
Framework: OSGi (Apache Felix)
SOAP support: Apache CXF
JMS broker: Apache ActiveMQ Routing Engine: Apache Camel
Apache Camel
Java DSL for EIP
from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“
”)). handle(Throwable.class). setFaultBody(constant(“
”)); from((“activemq:queue:requests?transacted=true”). process(requestTransformer). to(“http://host:8080/Request”). filter(xpath(“//nack”)). process(nackTransformer). to(“jdbc:store”); from(“http://localhost:8080/responses/”). tryBlock(). to(“activemq:queue:responses”). setOutBody(constant(“
”)). handle(Throwable.class). setFaultBody(constant(“
”)); from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”); from(“http://localhost:8080/pull/”). to(“jdbc:load”);
Apache Camel
Java DSL for EIP
from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“
”)). handle(Throwable.class). setFaultBody(constant(“
”)); from((“activemq:queue:requests?transacted=true”). from(“http://localhost:8080/requests/”). process(requestTransformer). to(“http://host:8080/Request”). tryBlock(). filter(xpath(“//nack”)). process(nackTransformer). to(“activemq:queue:requests”). to(“jdbc:store”); setOutBody(constant(“
”)). from(“http://localhost:8080/responses/”). tryBlock(). handle(Throwable.class). to(“activemq:queue:responses”). setOutBody(constant(“
”)). setFaultBody(constant(“
”)); handle(Throwable.class). setFaultBody(constant(“
”)); from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”); from(“http://localhost:8080/pull/”). to(“jdbc:load”);
Apache Camel
Java DSL for EIP
from(request). tryBlock(). to(requestStorage). setOutBody(constant(ack)). handle(Throwable.class). setFaultBody(constant(nack)); from(requestStorage). from(request). process(requestTransformer). to(requestProvider). tryBlock(). filter(isNack). process(nackTransformer). to(requestStorage). to(dbStorer); setOutBody(constant(ack)). from(responseConsumer). tryBlock(). handle(Throwable.class). to(responseStorage). setOutBody(constant(ack)). setFaultBody(constant(nack)); handle(Throwable.class). setFaultBody(constant(nack)); from(responseStorage). process(responseTransformer). to(dbStorer); from(response). to(dbLoader);
Apache Camel
Java DSL for EIP
from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“
”)). handle(Throwable.class). setFaultBody(constant(“
”)); from((“activemq:queue:requests?transacted=true”).
process(requestTransformer). to(“http://host:8080/Request”). filter(xpath(“//nack”)). process(nackTransformer). to(“jdbc:store”); from(“http://localhost:8080/responses/”). tryBlock(). to(“activemq:queue:responses”). setOutBody(constant(“”)). handle(Throwable.class). setFaultBody(constant(“”)); java.lang.Throwable from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”); from(“http://localhost:8080/pull/”). to(“jdbc:load”);
Tooling
Cimero
Tooling
Cimero
Contributed to Eclipse STP by Bull Currently under IP process at Eclipse Extend to provide support for Camel Roundtrip with Camel
Roadmap
ServiceMix 3.1.2 being release (first official release after graduation) ServiceMix 3.2 following (beginning of October) ServiceMix 4.0-m1 in october Milestones every month or so until 4.0 final (Q1 2008) Contributors are welcome!
Questions ?
Guillaume Nodet Blog: http://gnodet.blogspot.com Email: gnodet@gmail.com