Integration

     &
         DSL
  #TDC2011
@porcelli




                                                                    Alexandre Porcelli
                                                                        Founder




Alexandre Porcelli
Writer


                     Alexandre Porcelli
                     Organizer

                                          Alexandre Porcelli
                                          Commiter / Parser Developer


                                                                         Alexandre Porcelli
                                                                         API Designer / Developer
integration
THE reference
cloud
problems...
silos
3443
#facts


✓   #1 OPEN SOURCE ESB
✓   OVER 1.5 MILLION DOWNLOADS
✓   2500+ PRODUCTION DEPLOYMENTS
✓   PERFORMANCE: 10000 TPS
✓   SCALABLE: 13000 DEPLOYED SERVERS
✓   100+ CONNECTORS APPS & PROTOCOLS
✓   CLOUD CONNECTORS
enterprise...
                                Mule ESB    Mule ESB
                                Community   Enterprise
  High-performance ESB                         
  Access to source code                        
  Community extensions                         
  Management Console                            
  High availability                             
  Premium Connectors                            
  Self-healing connections                      
  Technical Support                             
  Knowledge Base                                

  Service packs / hot patches                   

  QA                                            
  Enterprise documentation                      
  Enterprise license                            
customers...
mule studio!
tech spec...
cloud connectors...
POJO!
 @Connector(namespacePrefix="my-push")
 public class MyPushCloudConnector {
     /**
         * Hostname of My Push Notification Gateway
         */
     @Property
     private String host;


     @Operation
     public void send(String deviceToken, @Parameter(optional=true)
     String alert, @Parameter(optional=true) String sound, @Parameter
     (optional=true, defaultValue="-1") int badge, @Parameter
     (optional=true) Map<String,String> fields) {
              ...
     }
 }
<flow name="Hello World">
    <composite-source>
        <!-- Incoming HTTP requests -->
        <inbound-endpoint address="http://localhost:8888" transformer-refs="HttpRequestToNameString" exchange-pattern="request-response"
            <not-filter>
                <wildcard-filter pattern="/favicon.ico"/>
            </not-filter>
        </inbound-endpoint>

        <!-- Incoming Servlet requests -->
        <inbound-endpoint address="servlet://name" transformer-refs="HttpRequestToNameString" exchange-pattern="request-response">
            <not-filter>
                <wildcard-filter pattern="/favicon.ico"/>
            </not-filter>
        </inbound-endpoint>

        <!-- Incoming VM requests -->
        <vm:inbound-endpoint path="greeter" transformer-refs="StringToNameString" exchange-pattern="request-response"/>
    </composite-source>

    <component class="org.mule.example.hello.Greeter"/>

    <choice>
        <when expression="payload    instanceof org.mule.example.hello.NameString" evaluator="groovy">
             <vm:outbound-endpoint   path="chitchatter" exchange-pattern="request-response"/>
        </when>
        <when expression="payload    instanceof java.lang.Exception" evaluator="groovy">
             <vm:outbound-endpoint   path="userErrorHandler" exchange-pattern="request-response"/>
        </when>
    </choice>

    <!-- Route unexpected errors to separate error handler -->
    <default-exception-strategy>
        <vm:outbound-endpoint path="systemErrorHandler" exchange-pattern="one-way"/>
    </default-exception-strategy>
</flow>
xml?
so what?
MuleContex context = Mule.newMuleContext();

Flow myFlow = new Flow();

myFlow.setName("MyFlow");

InboundEndpoint myIn = new GenericInboundEndpoint();
myIn.setURL("file:///Users/porcelli/in");

OutboundEndpoint myOut = new GenericOutboundEndpoint();
myIn.setURL("file:///Users/porcelli/out");

myFlow.setInbound(myIn);
myFlow.addMessageProcessor(myOut);

context.addFlow(myFlow);




                                              ok?
muleContext.start();
NO!
DSL!
goals...

 ➡ Expressive & Natural
 ➡ Easy to Use & Learn
 ➡ Hard to Misuse
 ➡ Extensible
Mule.newMuleContext(new AbstractModule() {
    @Override
    public void configure() {
        flow("MyFlow")
                .from("file:///Users/porcelli/in")
                .send("file:///Users/porcelli/out");
    }
}).start();
remember?
MuleContex context = Mule.newMuleContext();

Flow myFlow = new Flow();

myFlow.setName("MyFlow");

InboundEndpoint myIn = new GenericInboundEndpoint();
myIn.setURL("file:///Users/porcelli/in");

OutboundEndpoint myOut = new GenericOutboundEndpoint();
myIn.setURL("file:///Users/porcelli/out");

myFlow.setInbound(myIn);
myFlow.addMessageProcessor(myOut);

context.addFlow(myFlow);

muleContext.start();
feedback?
cloud...
final TwitterConnector twitterConnector = new TwitterConnector();
twitterConnector.setConsumerKey("key");
twitterConnector.setConsumerSecret("secret");
twitterConnector.setOathToken("token");

Mule.newMuleContext(new AbstractModule() {
    @Override
    public void configure() {
        flow("MyFlow")
                .from("file:///Users/porcelli/tweet")
                .transformTo(String.class)
                .process(twitterConnector.statusesUpdate(payload()));
    }
}).start();
demo
questions?
Thanks!


                    alexandre.porcelli@gmail.com

                    github.com/porcelli

about.me/porcelli   linkedin.com/in/alexandreporcelli

                    @porcelli

                    porcelli.com.br

Integration & DSL

  • 1.
    Integration & DSL #TDC2011
  • 2.
    @porcelli Alexandre Porcelli Founder Alexandre Porcelli Writer Alexandre Porcelli Organizer Alexandre Porcelli Commiter / Parser Developer Alexandre Porcelli API Designer / Developer
  • 3.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 12.
    #facts ✓ #1 OPEN SOURCE ESB ✓ OVER 1.5 MILLION DOWNLOADS ✓ 2500+ PRODUCTION DEPLOYMENTS ✓ PERFORMANCE: 10000 TPS ✓ SCALABLE: 13000 DEPLOYED SERVERS ✓ 100+ CONNECTORS APPS & PROTOCOLS ✓ CLOUD CONNECTORS
  • 13.
    enterprise... Mule ESB Mule ESB Community Enterprise High-performance ESB   Access to source code   Community extensions   Management Console  High availability  Premium Connectors  Self-healing connections  Technical Support  Knowledge Base  Service packs / hot patches  QA  Enterprise documentation  Enterprise license 
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
    POJO! @Connector(namespacePrefix="my-push") publicclass MyPushCloudConnector { /** * Hostname of My Push Notification Gateway */ @Property private String host; @Operation public void send(String deviceToken, @Parameter(optional=true) String alert, @Parameter(optional=true) String sound, @Parameter (optional=true, defaultValue="-1") int badge, @Parameter (optional=true) Map<String,String> fields) { ... } }
  • 21.
    <flow name="Hello World"> <composite-source> <!-- Incoming HTTP requests --> <inbound-endpoint address="http://localhost:8888" transformer-refs="HttpRequestToNameString" exchange-pattern="request-response" <not-filter> <wildcard-filter pattern="/favicon.ico"/> </not-filter> </inbound-endpoint> <!-- Incoming Servlet requests --> <inbound-endpoint address="servlet://name" transformer-refs="HttpRequestToNameString" exchange-pattern="request-response"> <not-filter> <wildcard-filter pattern="/favicon.ico"/> </not-filter> </inbound-endpoint> <!-- Incoming VM requests --> <vm:inbound-endpoint path="greeter" transformer-refs="StringToNameString" exchange-pattern="request-response"/> </composite-source> <component class="org.mule.example.hello.Greeter"/> <choice> <when expression="payload instanceof org.mule.example.hello.NameString" evaluator="groovy"> <vm:outbound-endpoint path="chitchatter" exchange-pattern="request-response"/> </when> <when expression="payload instanceof java.lang.Exception" evaluator="groovy"> <vm:outbound-endpoint path="userErrorHandler" exchange-pattern="request-response"/> </when> </choice> <!-- Route unexpected errors to separate error handler --> <default-exception-strategy> <vm:outbound-endpoint path="systemErrorHandler" exchange-pattern="one-way"/> </default-exception-strategy> </flow>
  • 22.
  • 24.
  • 26.
    MuleContex context =Mule.newMuleContext(); Flow myFlow = new Flow(); myFlow.setName("MyFlow"); InboundEndpoint myIn = new GenericInboundEndpoint(); myIn.setURL("file:///Users/porcelli/in"); OutboundEndpoint myOut = new GenericOutboundEndpoint(); myIn.setURL("file:///Users/porcelli/out"); myFlow.setInbound(myIn); myFlow.addMessageProcessor(myOut); context.addFlow(myFlow); ok? muleContext.start();
  • 27.
  • 28.
  • 29.
    goals... ➡ Expressive& Natural ➡ Easy to Use & Learn ➡ Hard to Misuse ➡ Extensible
  • 30.
    Mule.newMuleContext(new AbstractModule() { @Override public void configure() { flow("MyFlow") .from("file:///Users/porcelli/in") .send("file:///Users/porcelli/out"); } }).start();
  • 31.
    remember? MuleContex context =Mule.newMuleContext(); Flow myFlow = new Flow(); myFlow.setName("MyFlow"); InboundEndpoint myIn = new GenericInboundEndpoint(); myIn.setURL("file:///Users/porcelli/in"); OutboundEndpoint myOut = new GenericOutboundEndpoint(); myIn.setURL("file:///Users/porcelli/out"); myFlow.setInbound(myIn); myFlow.addMessageProcessor(myOut); context.addFlow(myFlow); muleContext.start();
  • 32.
  • 33.
    cloud... final TwitterConnector twitterConnector= new TwitterConnector(); twitterConnector.setConsumerKey("key"); twitterConnector.setConsumerSecret("secret"); twitterConnector.setOathToken("token"); Mule.newMuleContext(new AbstractModule() { @Override public void configure() { flow("MyFlow") .from("file:///Users/porcelli/tweet") .transformTo(String.class) .process(twitterConnector.statusesUpdate(payload())); } }).start();
  • 34.
  • 36.
  • 37.
    Thanks! alexandre.porcelli@gmail.com github.com/porcelli about.me/porcelli linkedin.com/in/alexandreporcelli @porcelli porcelli.com.br