29
Apache ServiceMi x 4.0 The Next Generation ESB Guillaume Nodet

Apache ServiceMix 4.0 The Next Generation ESB Guillaume Nodet

Embed Size (px)

Citation preview

Apache ServiceMix 4.0The Next Generation ESB

Guillaume Nodet

About the author

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

Guillaume Nodet

ScheduleJBI 1.0

Overview

Architecture

WSDL Messaging Model

Normalized Message Router

Lessons learned

Apache ServiceMix 4.0

Goal

Standard based

Simplified API

Building blocks

OSGi as a platform

Spring for configuration

Intuitive EIP router

High performance message broker

Easy to use Services Framework

Around the container

Eclipse tooling

Long term

JBI 2.0, SCA

Demo

JBI 1.0: what is JBI?

Integration SystemsPlug-in ComponentsNormalized exchangesWSDLDecoupling

JBI 1.0: architecture

JBI 1.0: WSDL messaging model

Abstract model

Concrete model

Service providers

Service consumers

JBI 1.0: WSDL messaging model

Message typeNormal

Faults

OperationQualified name

Message Exchange Pattern

Message types

Interface Qualified name

Operations

Extended interfaces

Abstract model

JBI 1.0: WSDL messaging model

Binding type

EndpointEndpoint name

Binding type

ServiceQualified name

Interface name

Endpoints

Concrete model

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

Consumers and providersWSDL description

Abstract model

Decoupled

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

Normalized MessageXML payload

Properties

Attachments

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

Delivery ChannelCommunication between a component and the NMR

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

Endpoint activationDeclaring Service endpoint

Providing metadata

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

Service invocation and MEPIn-Only

Robust-In-Only

In-Out

In-Optional-Out

JBI 1.0: Normalized Message Router

Consumers and providersNormalized MessageDelivery ChannelRun-time Endpoint ActivationService invocation and MEPsMessage ExchangeEndpoints

EndpointsExternal

Internal

AddressingImplicit

Explicit

Dynamic

JBI 1.0: Normalized Message Router

JBI 1.0: Lessons learned

ProsNormalized exchanges

Normalized Message Router

ConsClassloader 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 basedShort Term

JBI 1.0

JAX-WS, WS-*

On the long term

JBI 2.0 support

SCA

IONA Support

Involved in JBI 2.0 EG, OSGi Alliance (leading OSGi Enterprise Edition EG), SCA

ServiceMix 4.0: Simplified APINo more components

Deployment / Classloader is delegated to OSGi

Bundles as the packaging and extension mechanismLeverages OSGi architecture

Leverage spring-osgi (optionally)

Endpoints as first-class citizensEndpoint are activated when registered in the OSGi registry

Channel is now on the Endpoint

Endpoints use push delivery rather than pulling the channel

Building blocksAvoid reinventing the wheel

Framework: OSGi (Apache Felix)

SOAP support: Apache CXF

JMS broker: Apache ActiveMQ

Routing Engine: Apache Camel

Apache CamelJava DSL for EIP

from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

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(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”);

from(“http://localhost:8080/pull/”). to(“jdbc:load”);

Apache CamelJava DSL for EIP

from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

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(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”);

from(“http://localhost:8080/pull/”). to(“jdbc:load”);

from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

Apache CamelJava DSL for EIP

from(request). tryBlock(). to(requestStorage). setOutBody(constant(ack)). handle(Throwable.class). setFaultBody(constant(nack));

from(requestStorage). process(requestTransformer). to(requestProvider). filter(isNack). process(nackTransformer). to(dbStorer);

from(responseConsumer). tryBlock(). to(responseStorage). setOutBody(constant(ack)). handle(Throwable.class). setFaultBody(constant(nack));

from(responseStorage). process(responseTransformer). to(dbStorer);

from(response). to(dbLoader);

from(request). tryBlock(). to(requestStorage). setOutBody(constant(ack)). handle(Throwable.class). setFaultBody(constant(nack));

Apache CamelJava DSL for EIP

from(“http://localhost:8080/requests/”). tryBlock(). to(“activemq:queue:requests”). setOutBody(constant(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

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(“<ack/>”)). handle(Throwable.class). setFaultBody(constant(“<nack/>”));

from(“activemq:queue:responses?transacted=true”). process(responseTransformer). to(“jdbc:store”);

from(“http://localhost:8080/pull/”). to(“jdbc:load”);

<route> <from uri=“http://localhost:8080/requests/” /> <try> <to uri=“activemq:queue:requests” /> <process ref=“setAck” /> <catch> <exception>java.lang.Throwable</exception> <process ref=“setNack” /> </catch> </try></route>

Tooling

Cimero

Tooling

CimeroContributed 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 NodetBlog: http://gnodet.blogspot.comEmail: [email protected]