Upload
duncan-setter
View
230
Download
0
Tags:
Embed Size (px)
Citation preview
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: 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: 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
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!