SlideShare una empresa de Scribd logo
1 de 75
Spring and Cloud Foundry: a Marriage Made in Heaven
Josh Long, Spring Developer Advocate
SpringSource, a division of VMware

Twitter: @starbuxman
Email: josh.long@springsource.com
About Josh Long

Spring Developer Advocate
twitter: @starbuxman
josh.long@springsource.com




                         NOT CONFIDENTIAL -- TELL EVERYONE   2
Spring Makes Building Applications Easy...




                        NOT CONFIDENTIAL -- TELL EVERYONE   3
Tell Spring About Your Objects

 package the.package.with.beans.in.it;

 @Service
 public class CustomerService {

     public Customer createCustomer(String firstName,
                                   String lastName,
                                   Date signupDate) {

     }

     ...

 }




                                                        4
I want Database Access ... with Hibernate 4 Support

 package the.package.with.beans.in.it;
 ...
 @Service
 public class CustomerService {

     @Inject
     private SessionFactory sessionFactory;

     public Customer createCustomer(String firstName,
                                   String lastName,
                                   Date signupDate) {
       Customer customer = new Customer();
       customer.setFirstName(firstName);
       customer.setLastName(lastName);
       customer.setSignupDate(signupDate);

           sessionFactory.getCurrentSession().save(customer);
           return customer;
     }

     ...

 }
                                                                5
I want Declarative Transaction Management...

 package the.package.with.beans.in.it;
 ...
 @Service
 public class CustomerService {

     @Inject
     private SessionFactory sessionFactory;

     @Transactional
     public Customer createCustomer(String firstName,
                                   String lastName,
                                   Date signupDate) {
       Customer customer = new Customer();
       customer.setFirstName(firstName);
       customer.setLastName(lastName);
       customer.setSignupDate(signupDate);

           sessionFactory.getCurrentSession().save(customer);
           return customer;
     }
     ...
 }

                                                                6
I want Declarative Cache Management...

 package the.package.with.beans.in.it;
 ...
 @Service
 public class CustomerService {

     @Inject
     private SessionFactory sessionFactory;

     @Transactional
     @Cacheable(“customers”)
     public Customer createCustomer(String firstName,
                                   String lastName,
                                   Date signupDate) {
       Customer customer = new Customer();
       customer.setFirstName(firstName);
       customer.setLastName(lastName);
       customer.setSignupDate(signupDate);

         sessionFactory.getCurrentSession().save(customer);
         return customer;
     }
 }

                                                              7
I want a RESTful Endpoint...

 package org.springsource.examples.spring31.web;
 ..

 @Controller
 public class CustomerController {

     @Inject
     private CustomerService customerService;

     @RequestMapping(value = "/customer/{id}",
                       produces = MediaType.APPLICATION_JSON_VALUE)
     public @ResponseBody Customer customerById(@PathVariable("id") Integer id) {
         return customerService.getCustomerById(id);
     }
      ...
 }




                                                                              8
Spring’s aim:
 bring simplicity to Java development
                                                               data
  web tier
                                batch       integration &     access
    &        service tier                                                      mobile
                             processing      messaging      / NoSQL /
   RIA
                                                            Big Data


                            The Spring framework
the cloud:                    lightweight                      traditional

      CloudFoundry                        tc Server                  WebSphere
    Google App Engine                      Tomcat                     JBoss AS
   Amazon Web Services                       Jetty                   WebLogic
                                                                 (on legacy versions, too!)




                                                                                              9
Now we just need a platform...




                         NOT CONFIDENTIAL -- TELL EVERYONE   10
Cloud Foundry: Choice of Runtimes




                                    11
Frameworks and Runtimes Supported

• Out of the Box
  • Java (.WAR files, on Tomcat. Spring’s an ideal choice here, of course..)
  • Scala (Lift, Play!)
  • Ruby (Rails, Sinatra, etc.)
  • Node.js

• Ecosystem Partners
  • .NET (Uhuru, Tier3)
     • both from Seattle-native partners!
     • Runs standard .NET (no need to port your application)
  • Python (Stackato)
  • PHP (AppFog)
  • Haskell (1)
  • Erlang (2)


1) http://www.cakesolutions.net/teamblogs/2011/11/25/haskell-happstack-on-cloudfoundry/
2) https://github.com/cloudfoundry/vcap/pull/20



                                                                                      12
Manifests

 ---
 applications:
   target:
       name: html5expenses
       url: ${name}.${target-base}
       framework:
         name: spring
         info:
           mem: 512M
           description: Java SpringSource Spring Application
           exec:
       mem: 512M
       instances: 1
       services:
         expenses-mongo:
           type: :mongodb
         expenses-postgresql:
           type: :postgresql
Demo: Deploying an Application
      ...from vmc
              with and without manifest.yml

       ...from STS




                         NOT CONFIDENTIAL -- TELL EVERYONE   14
Cloud Foundry: Choice of Clouds




                                  15
Main Risk: Lock In




                     Welcome to the hotel california
                     Such a lovely place
                     Such a lovely face
                     Plenty of room at the hotel california
                     Any time of year, you can find it here

                     Last thing I remember, I was
                     Running for the door
                     I had to find the passage back
                     To the place I was before
                     ’relax,’ said the night man,
                     We are programmed to receive.
                     You can checkout any time you like,
                     But you can never leave!

                                  -the Eagles




                                                              16
Open Source Advantage




17
Open Source Advantage
Cloud Foundry: Clouds


              AppFog.com
              • community lead for PHP
              • PaaS for PHP


              Joyent
              • community lead for Node.js




              ActiveState
              • community lead for Python, Perl
              • Providers of Stackato private PaaS




                                                     19
Cloud Foundry Community
      Foundry.org




                          20
Micro Cloud Foundry (beta)
Micro Cloud Foundry
Cloud Foundry: Services




                          22
Cloud Foundry: Services
 Services are one of the extensibility planes in Cloud Foundry
 • there are more services being contributed by the community daily!

 MySQL, Redis, MongoDB, RabbitMQ, PostgreSQL

 Services may be shared across applications

 Cloud Foundry abstracts the provisioning aspect of services through
 a uniform API hosted in the cloud controller

 It’s very easy to take an app and add a service to the app in a uniform
 way
 • Cassandra? COBOL / CICS, Oracle




                                                                        23
Cloud Foundry: Services
 Take Advantage of Services
 • they cost nothing to setup
 • they deliver value

 They Encourage Better Architectures
 • Need a fast read-write cache? Redis is ready to go!
 • Need to store long-tail documents? Give MongoDB a try
 • Need to decouple what applications do from when they do it?
  Use messaging and RabbitMQ




                                                                 24
Spring’s the Best Toolkit for Your Services
 Spring Data
 • supports advanced JPA, MongoDB, Redis connectivity
 Spring AMQP, Spring Integration
 • Supports messaging, and event-driven architectures
 Spring core
 • Has best-of-breed support for RDBMS access, be it through JPA, JDBC, JDO,
  Hibernate, etc.




                                                                               25
Let’s Talk About Spring, Baby...




                          NOT CONFIDENTIAL -- TELL EVERYONE   26
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
Tangent: Quick Primer on Java Configuration in Spring 3.1

 ....
<beans>

<tx:annotation-driven transaction-manager = "txManager" />

<context:component-scan base-package = "org.springsource.examples.spring31.services" />

<context:property-placeholder properties = "config.properties" />

<bean id = "txManager"
      class = "org.springframework.orm.hibernate3.HibernateTransactionManager">
   <property name = "sessionFactory" ref = "mySessionFactory" />
</bean>

 <bean id = "sessionFactory"
       class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean">
  ...
 </bean>

</beans>
Tangent: Quick Primer on Java Configuration in Spring 3.1


@Configuration
@PropertySource("/config.properties")
@EnableTransactionManagement
@ComponentScan(basePackageClasses = {CustomerService.class})
public class ServicesConfiguration {

    @Bean
    public PlatformTransactionManager txManager() throws Exception {
      return new HibernateTransactionManager(this.sessionFactory());
    }

    @Bean
    public SessionFactory sessionFactory() { ... }

}
The 80% Case




               NOT CONFIDENTIAL -- TELL EVERYONE   40
Auto-Reconfiguration
 Solves the 80% Case
 Application works on Tomcat, connects to an RDBMS, uses Spring
 Cloud Foundry Supports This out of the Box
 • Auto reconfiguration
 Supported by many technologies (Spring, Ruby, Grails, Lift, etc.)
Auto-Reconfiguration
 Detects common Java beans:
 • DataSource
 • RedisConnectionFactory
 • RabbitConnectionFactory
 • Mongo

 hibernate.dialect property becomes MySQLDialect,
 PostgreSQLDialect
 • org.springframework.orm.jpa.AbstractEntityManagerFactoryBean
 • org.springframework.orm.hibernate3.AbstractSessionFactoryBean
  (Spring 2.5 and 3.0)
 • org.springframework.orm.hibernate3.SessionFactoryBuilderSupport
  (Spring 3.1)

 Cloud Foundry installs a BeanFactoryPostProcessor




                                                                     42
The cloud namespace




                      NOT CONFIDENTIAL -- TELL EVERYONE   43
the cloud Namespace

 <cloud:> namespace for use in Spring app contexts

 Provides application-level control of bean service bindings

 Use when you have multiple...
 • services of the same type
 • beans of the same type, e.g.: DataSource, MongoDBFactory
 Use when you have custom bean configuration
 • data source pool size, connection properties




                                                                44
<cloud:data-source>
 Configures a DataSource bean
 • Commons DBCP or Tomcat DataSource
 Basic attributes:
 • id: defaults to service name
 • service-name: only needed if you have multiple relational database services bound to
  the app




   <cloud:data-source id="dataSource"/>

   <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean"
   id="entityManagerFactory">
       <property name="dataSource" ref="dataSource"/>
   </bean>


                                                                                          45
<cloud:data-source>
 Configures a DataSource bean
 • Commons DBCP or Tomcat DataSource
 Basic attributes:
 • id: defaults to service name
 • service-name: only needed if you have multiple relational database services bound to
  the app




   <cloud:data-source id="dataSource"/>

   <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean"
   id="entityManagerFactory">
       <property name="dataSource" ref="dataSource"/>
   </bean>


                                                                                          46
<cloud:data-source> Example




<cloud:data-source id="dataSource" service-name="mySQLSvc">
   <cloud:pool pool-size="1-5"/>
   <cloud:connection properties="charset=utf-8"/>
</cloud:data-source>


...

@Autowired
private DataSource dataSource ;




                                                              47
<cloud:properties>

<cloud:properties id="cloudProperties" />
<context:property-placeholder properties-ref="cloudProperties"/>




 @Autowired private Environment environment;

 @Bean
 public ComboPooledDataSource dataSource() throws Exception {
   String user = this.environment.getProperty
        ("cloud.services.mysql.connection.username");
   ComboPooledDataSource cpds = new ComboPooledDataSource();
   cpds.setUser(user);
   return cpds;
 }



                                                                   48
Using the CloudEnvironment API




                      NOT CONFIDENTIAL -- TELL EVERYONE   49
The Spring Developer’s Perspective: The Environment



$VCAP_SERVICES:
{"redis-2.2":
[{"name":"redis_sample","label":"redis-2.2","plan":"free",
"tags":["redis","redis-2.2","key-value","nosql"],
"credentials":
{"hostname":"172.30.48.40",
"host":"172.30.48.40",
"port":5023,
"password":"8e9a901f-987d-4544-9a9e-ab0c143b5142",
"name":"de82c4bb-bd08-46c0-a850-af6534f71ca3"}
}],
"mongodb-1.8":[{"name":"mongodb-
e7d29","label":"mongodb-1.8","plan":"free","tags”:………………….



                                                             50
Giving Your Application Clues with the env command

env <appname>
     List application environment variables


env-add <appname> <variable[=]value>
     Add an environment variable to an application

env-del <appname> <variable>
     Delete an environment variable to an application




$ env-add html5expenses PAYMENT_GATEWAY=http://blah.com

       is the same as..
$ export PAYMENT_GATEWAY=http://blah.com




                                                          51
The Spring Developer’s Perspective: The Environment




 <dependency>
   <groupId>org.cloudfoundry</groupId>
    <artifactId>cloudfoundry-runtime</artifactId>
    <version>0.8.1</version>
  </dependency>




                                                      52
The Spring Developer’s Perspective: The Environment




CloudEnvironment e = new CloudEnvironment();

Iterable<RdbmsServiceInfo> dsServiceInformation =
   e.getServiceInfos( RdbmsServiceInfo.class) ;

Iterable<RedisServiceInfo> redisServiceInformation =
   e.getServiceInfos( RedisServiceInfo.class) ;

Iterable<RabbitServiceInfo> rabbitServiceInformation =
   e.getServiceInfos( RabbitServiceInfo.class) ;




                                                         53
Using ServiceCreator



//Provides access to CF service and application env info
CloudEnvironment environment = new CloudEnvironment();
	    	
//Retrieve env info for bound service named "mysqlService"
RdbmsServiceInfo mysqlSvc =
       environment.getServiceInfo("mysqlService", RdbmsServiceInfo.class);
	    	
//create a DataSource bound to the service
RdbmsServiceCreator dataSourceCreator = new RdbmsServiceCreator();

DataSource dataSource = dataSourceCreator.createService(mysqlSvc);




                                                                             54
Using ServiceInfo



//Provides access to CF service and application env info
CloudEnvironment environment = new CloudEnvironment();
	    	
//Retrieve env info for bound service named "mongoService"
MongoServiceInfo mongoSvc =
      environment.getServiceInfo("mongoService", MongoServiceInfo.class);
	    	
//create a Mongo DB bound to the service
Mongo mongoDB = new Mongo(mongoSvc.getHost(), mongoSvc.getPort());




                                                                            55
Demo: Scaling with vmc instances and CloudEnvironment




                      NOT CONFIDENTIAL -- TELL EVERYONE   56
One Binary to Rule Them All




                        NOT CONFIDENTIAL -- TELL EVERYONE   57
Spring 3.1 Profiles
 ...
 <beans ....>
 In Development = “default”>
   <beans profile
   <ds:embedded-database id= "dataSource" type = “H2” />
  </beans>
 In Production
  <beans profile = “cloud”>
   <cloud:data-source id="dataSource"/>
  </beans>

 </beans>




                                                           58
Spring 3.1 Profiles
 ...
 <beans ....>

  <beans profile = “dev”>
   <ds:embedded-database id= "dataSource" type = “H2” />
  </beans>

  <beans profile = “cloud”>
   <cloud:data-source id="dataSource"/>
  </beans>

 </beans>




                                                           59
Spring 3.1 Profiles
 “cloud” profile automatically activates on Cloud Foundry
 • usage of the cloud namespace should occur within the cloud profile block




                                                                              60
Demo: Look at a Multi-Env Application with H2 and PostgreSQL




                        NOT CONFIDENTIAL -- TELL EVERYONE      61
A Running Tour of Some Useful Spring’s APIs




                        NOT CONFIDENTIAL -- TELL EVERYONE   62
Using MongoDB from Cloud Foundry




                     NOT CONFIDENTIAL -- TELL EVERYONE   63
Using MongoDB from Cloud Foundry



     <cloud:mongo-db-factory
               id="mongoFactory"
               service-name="mongo1"
               write-concern="SAFE"
         >
         <cloud:mongo-options
               connections-per-host="..."
               max-wait-time="..."
         />
     </cloud:mongo-db-factory>




  for a sophisticated example, check out
  http://www.github.com/SpringSource/cloudfoundry-samples/cross-store

                           NOT CONFIDENTIAL -- TELL EVERYONE            64
Demo: Cross Store Persistence with MongoDB on Cloud Foundry




                       NOT CONFIDENTIAL -- TELL EVERYONE      65
the ORIGINAL “Cloud Scale Messaging”




                                       66
RabbitMQ – Messaging that Just Works




                        Robust
                   High-performance
                      Easy to use
                    AMQP LEADER
Why AMQP?

 A Protocol, not an API
 •A defined set of
 messaging capabilities
 called the AMQ model
 •A network wire-level
 protocol, AMQP

                          On commodity hardware
                          •10-25 thousand
                          messages per second is
                          routine *
                          •The NIC is usually the
                          bottleneck

17                          * Non-persistent messages
Spring AMQP

 Encapsulates low-level details
 Simplifies sending and receiving    Producer          Consumer
 of messages



                                       Amqp              Listener
                                      Template          Container


                                     Spring AMQP




                                                 AMQP
Sending AMQP messages


@Component public class MessageSender {

 @Autowired
 private volatile AmqpTemplate amqpTemplate;

 public void send(String message) {
   this.amqpTemplate.convertAndSend(
        "myExchange", "some.routing.key", message);
 }

}




                                                      70
Receiving AMQP messages

 public class MyComponent {

     @Autowired
     private AmqpTemplate amqpTemplate;

     public void read() throws Exception {
        ...
       String value = amqpTemplate.receiveAndConvert("myQueueName");
       ...
     }

 }




                                                                       71
Spring AMQP: SimpleMessageListenerContainer
     Asynchronous message receiver
     POJO handlers
     Handles re-connection and listener failure (rollback, redelivery)
     Message conversion and error handling strategies




<listener-container connection-factory="rabbitConnectionFactory">
 <listener ref="handler" method="handle" queue-names="my.queue">
</listener-container>




                                                                          72
Using Redis from Cloud Foundry as a CacheManager




  @Bean
  public CacheManager cacheManager() throws Exception {
      return new RedisCacheManager(redisTemplate());
  }




                              NOT CONFIDENTIAL -- TELL EVERYONE   73
Demo: Implementing Caching in the Cloud
      add data, remove some data, request data

       $> vmc tunnel redis
       keys *




                        NOT CONFIDENTIAL -- TELL EVERYONE   74
CloudFoundry.com signup promo code: cloudtalk




             Questions?
             Say hi on Twitter:
@starbuxman NOT CONFIDENTIAL -- TELL EVERYONE
            @springsource @cloudfoundry

Más contenido relacionado

La actualidad más candente

OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneidermfrancis
 
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...mobiweave
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf
 
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009Alexandre Morgaut
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with GradleRyan Cuprak
 
Java EE 8 Update
Java EE 8 UpdateJava EE 8 Update
Java EE 8 UpdateRyan Cuprak
 
Kubernetes #4 volume &amp; stateful set
Kubernetes #4   volume &amp; stateful setKubernetes #4   volume &amp; stateful set
Kubernetes #4 volume &amp; stateful setTerry Cho
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukGraham Tackley
 
Orchestration & provisioning
Orchestration & provisioningOrchestration & provisioning
Orchestration & provisioningbuildacloud
 
vert.x - asynchronous event-driven web applications on the JVM
vert.x - asynchronous event-driven web applications on the JVMvert.x - asynchronous event-driven web applications on the JVM
vert.x - asynchronous event-driven web applications on the JVMjbandi
 
Async servers and clients in Rest.li
Async servers and clients in Rest.liAsync servers and clients in Rest.li
Async servers and clients in Rest.liKaran Parikh
 
Writing RESTful web services using Node.js
Writing RESTful web services using Node.jsWriting RESTful web services using Node.js
Writing RESTful web services using Node.jsFDConf
 
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQLHTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQLUlf Wendel
 
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effort
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effortHow to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effort
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effortShapeBlue
 
Supporting Hyper-V 3.0 on Apache CloudStack
Supporting Hyper-V 3.0 on Apache CloudStackSupporting Hyper-V 3.0 on Apache CloudStack
Supporting Hyper-V 3.0 on Apache CloudStackDonal Lafferty
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App EngineIndicThreads
 
OSGi Service Platform 4.2
OSGi Service Platform 4.2OSGi Service Platform 4.2
OSGi Service Platform 4.2Ilya Katsov
 
Play + scala + reactive mongo
Play + scala + reactive mongoPlay + scala + reactive mongo
Play + scala + reactive mongoMax Kremer
 
Getting Started with WebSockets and Server-Sent Events
Getting Started with WebSockets and Server-Sent EventsGetting Started with WebSockets and Server-Sent Events
Getting Started with WebSockets and Server-Sent EventsArun Gupta
 

La actualidad más candente (20)

Java EE 7 overview
Java EE 7 overviewJava EE 7 overview
Java EE 7 overview
 
OSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian SchneiderOSGi ecosystems compared on Apache Karaf - Christian Schneider
OSGi ecosystems compared on Apache Karaf - Christian Schneider
 
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...
Cloud apps with REST APIs using Windows Azure, Asp.NET, ServiceStack and Angu...
 
GR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug inGR8Conf 2011: Grails, how to plug in
GR8Conf 2011: Grails, how to plug in
 
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
Wakanda: a new end-to-end JavaScript platform - JSConf Berlin 2009
 
Faster Java EE Builds with Gradle
Faster Java EE Builds with GradleFaster Java EE Builds with Gradle
Faster Java EE Builds with Gradle
 
Java EE 8 Update
Java EE 8 UpdateJava EE 8 Update
Java EE 8 Update
 
Kubernetes #4 volume &amp; stateful set
Kubernetes #4   volume &amp; stateful setKubernetes #4   volume &amp; stateful set
Kubernetes #4 volume &amp; stateful set
 
Why we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.ukWhy we chose mongodb for guardian.co.uk
Why we chose mongodb for guardian.co.uk
 
Orchestration & provisioning
Orchestration & provisioningOrchestration & provisioning
Orchestration & provisioning
 
vert.x - asynchronous event-driven web applications on the JVM
vert.x - asynchronous event-driven web applications on the JVMvert.x - asynchronous event-driven web applications on the JVM
vert.x - asynchronous event-driven web applications on the JVM
 
Async servers and clients in Rest.li
Async servers and clients in Rest.liAsync servers and clients in Rest.li
Async servers and clients in Rest.li
 
Writing RESTful web services using Node.js
Writing RESTful web services using Node.jsWriting RESTful web services using Node.js
Writing RESTful web services using Node.js
 
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQLHTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
HTTP, JSON, JavaScript, Map&Reduce built-in to MySQL
 
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effort
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effortHow to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effort
How to add a new hypervisor to CloudStack - Lessons learned from Hyper-V effort
 
Supporting Hyper-V 3.0 on Apache CloudStack
Supporting Hyper-V 3.0 on Apache CloudStackSupporting Hyper-V 3.0 on Apache CloudStack
Supporting Hyper-V 3.0 on Apache CloudStack
 
Testing Your Application On Google App Engine
Testing Your Application On Google App EngineTesting Your Application On Google App Engine
Testing Your Application On Google App Engine
 
OSGi Service Platform 4.2
OSGi Service Platform 4.2OSGi Service Platform 4.2
OSGi Service Platform 4.2
 
Play + scala + reactive mongo
Play + scala + reactive mongoPlay + scala + reactive mongo
Play + scala + reactive mongo
 
Getting Started with WebSockets and Server-Sent Events
Getting Started with WebSockets and Server-Sent EventsGetting Started with WebSockets and Server-Sent Events
Getting Started with WebSockets and Server-Sent Events
 

Destacado

10 分でわかる Cloud Foundry Summit 2016 報告
10 分でわかる Cloud Foundry Summit 2016 報告10 分でわかる Cloud Foundry Summit 2016 報告
10 分でわかる Cloud Foundry Summit 2016 報告Hiroaki_UKAJI
 
Cloud Foundry, the Open Platform As A Service
Cloud Foundry, the Open Platform As A ServiceCloud Foundry, the Open Platform As A Service
Cloud Foundry, the Open Platform As A ServicePatrick Chanezon
 
Marlee Butlin | Favorite Yoga Positions
Marlee Butlin | Favorite Yoga PositionsMarlee Butlin | Favorite Yoga Positions
Marlee Butlin | Favorite Yoga PositionsMarlee Butlin
 
Crippled man and_the_prostitute
Crippled man and_the_prostituteCrippled man and_the_prostitute
Crippled man and_the_prostituteVijayakumar Reddy
 
Jesus Christ Walks On Water
Jesus Christ Walks On WaterJesus Christ Walks On Water
Jesus Christ Walks On WaterMary Sorial
 
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8Steve Thomason
 
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...South African Heterosexual Males Paying for Sex: Motivations, Justifications ...
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...EmbraceDignity
 
Mfv ren ch.6
Mfv ren ch.6Mfv ren ch.6
Mfv ren ch.665swiss
 
Presence, identity, and attention in social web architecture
Presence, identity, and attention in social web architecturePresence, identity, and attention in social web architecture
Presence, identity, and attention in social web architectureChristian Crumlish
 
Biabh Ia Summit08 Roundup
Biabh Ia Summit08 RoundupBiabh Ia Summit08 Roundup
Biabh Ia Summit08 RoundupFilip Borloo
 
Jesus walks on water ~ World Prayr
Jesus walks on water ~ World PrayrJesus walks on water ~ World Prayr
Jesus walks on water ~ World PrayrRobert Dodson
 
Awesome Air Photos
Awesome Air PhotosAwesome Air Photos
Awesome Air PhotosCaro Lina
 
A man walks on water powerpoint
A man walks on water powerpointA man walks on water powerpoint
A man walks on water powerpointCarmen Johnson
 
Dr. Strange - Dealing with an Arrogant Person at Work
Dr. Strange - Dealing with an Arrogant Person at WorkDr. Strange - Dealing with an Arrogant Person at Work
Dr. Strange - Dealing with an Arrogant Person at WorkRoberto de Paula Lico Junior
 
Count the stars | A Sermon on Genesis 15:6
Count the stars | A Sermon on Genesis 15:6Count the stars | A Sermon on Genesis 15:6
Count the stars | A Sermon on Genesis 15:6Steve Thomason
 
Jesus transfigured! mk 9-1-13 - sept 8, 2013
Jesus transfigured!   mk 9-1-13 - sept 8, 2013Jesus transfigured!   mk 9-1-13 - sept 8, 2013
Jesus transfigured! mk 9-1-13 - sept 8, 2013John Smith
 

Destacado (20)

10 分でわかる Cloud Foundry Summit 2016 報告
10 分でわかる Cloud Foundry Summit 2016 報告10 分でわかる Cloud Foundry Summit 2016 報告
10 分でわかる Cloud Foundry Summit 2016 報告
 
Cloud Foundry, the Open Platform As A Service
Cloud Foundry, the Open Platform As A ServiceCloud Foundry, the Open Platform As A Service
Cloud Foundry, the Open Platform As A Service
 
Marlee Butlin | Favorite Yoga Positions
Marlee Butlin | Favorite Yoga PositionsMarlee Butlin | Favorite Yoga Positions
Marlee Butlin | Favorite Yoga Positions
 
Ranas
RanasRanas
Ranas
 
Crippled man and_the_prostitute
Crippled man and_the_prostituteCrippled man and_the_prostitute
Crippled man and_the_prostitute
 
Awesome Air Photos
Awesome Air PhotosAwesome Air Photos
Awesome Air Photos
 
Jesus Christ Walks On Water
Jesus Christ Walks On WaterJesus Christ Walks On Water
Jesus Christ Walks On Water
 
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8
A Glimpse | A Sermon for Transfiguration Sunday from Mark 8:27-9:8
 
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...South African Heterosexual Males Paying for Sex: Motivations, Justifications ...
South African Heterosexual Males Paying for Sex: Motivations, Justifications ...
 
The wedding at cana
The wedding at canaThe wedding at cana
The wedding at cana
 
Mfv ren ch.6
Mfv ren ch.6Mfv ren ch.6
Mfv ren ch.6
 
Jesus calms the storm
Jesus calms the stormJesus calms the storm
Jesus calms the storm
 
Presence, identity, and attention in social web architecture
Presence, identity, and attention in social web architecturePresence, identity, and attention in social web architecture
Presence, identity, and attention in social web architecture
 
Biabh Ia Summit08 Roundup
Biabh Ia Summit08 RoundupBiabh Ia Summit08 Roundup
Biabh Ia Summit08 Roundup
 
Jesus walks on water ~ World Prayr
Jesus walks on water ~ World PrayrJesus walks on water ~ World Prayr
Jesus walks on water ~ World Prayr
 
Awesome Air Photos
Awesome Air PhotosAwesome Air Photos
Awesome Air Photos
 
A man walks on water powerpoint
A man walks on water powerpointA man walks on water powerpoint
A man walks on water powerpoint
 
Dr. Strange - Dealing with an Arrogant Person at Work
Dr. Strange - Dealing with an Arrogant Person at WorkDr. Strange - Dealing with an Arrogant Person at Work
Dr. Strange - Dealing with an Arrogant Person at Work
 
Count the stars | A Sermon on Genesis 15:6
Count the stars | A Sermon on Genesis 15:6Count the stars | A Sermon on Genesis 15:6
Count the stars | A Sermon on Genesis 15:6
 
Jesus transfigured! mk 9-1-13 - sept 8, 2013
Jesus transfigured!   mk 9-1-13 - sept 8, 2013Jesus transfigured!   mk 9-1-13 - sept 8, 2013
Jesus transfigured! mk 9-1-13 - sept 8, 2013
 

Similar a Spring in the Cloud - using Spring with Cloud Foundry

Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenJoshua Long
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusEmily Jiang
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Felix Gessert
 
NSA for Enterprises Log Analysis Use Cases
NSA for Enterprises   Log Analysis Use Cases NSA for Enterprises   Log Analysis Use Cases
NSA for Enterprises Log Analysis Use Cases WSO2
 
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...Michael Elder
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Enginecatherinewall
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with SpringJoshua Long
 
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)Chris Richardson
 
Introduction to Apache NiFi 1.11.4
Introduction to Apache NiFi 1.11.4Introduction to Apache NiFi 1.11.4
Introduction to Apache NiFi 1.11.4Timothy Spann
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020Emily Jiang
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020Emily Jiang
 
XPages Blast - ILUG 2010
XPages Blast - ILUG 2010XPages Blast - ILUG 2010
XPages Blast - ILUG 2010Tim Clark
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugToshiaki Maki
 
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~Brocade
 
Real time dashboards with Kafka and Druid
Real time dashboards with Kafka and DruidReal time dashboards with Kafka and Druid
Real time dashboards with Kafka and DruidVenu Ryali
 
Building a serverless company on AWS lambda and Serverless framework
Building a serverless company on AWS lambda and Serverless frameworkBuilding a serverless company on AWS lambda and Serverless framework
Building a serverless company on AWS lambda and Serverless frameworkLuciano Mammino
 
Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1Mohammad Qureshi
 

Similar a Spring in the Cloud - using Spring with Cloud Foundry (20)

Spring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in HeavenSpring and Cloud Foundry; a Marriage Made in Heaven
Spring and Cloud Foundry; a Marriage Made in Heaven
 
Spring.io
Spring.ioSpring.io
Spring.io
 
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexusMicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
MicroProfile, Docker, Kubernetes, Istio and Open Shift lab @dev nexus
 
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
Building a Global-Scale Multi-Tenant Cloud Platform on AWS and Docker: Lesson...
 
NSA for Enterprises Log Analysis Use Cases
NSA for Enterprises   Log Analysis Use Cases NSA for Enterprises   Log Analysis Use Cases
NSA for Enterprises Log Analysis Use Cases
 
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...
Streaming Movies brings you Streamlined Applications -- How Adopting Netflix ...
 
Cannibalising The Google App Engine
Cannibalising The  Google  App  EngineCannibalising The  Google  App  Engine
Cannibalising The Google App Engine
 
Multi Client Development with Spring
Multi Client Development with SpringMulti Client Development with Spring
Multi Client Development with Spring
 
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)
Deploying Spring Boot applications with Docker (east bay cloud meetup dec 2014)
 
Introduction to Apache NiFi 1.11.4
Introduction to Apache NiFi 1.11.4Introduction to Apache NiFi 1.11.4
Introduction to Apache NiFi 1.11.4
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
Cloud nativemicroservices jax-london2020
Cloud nativemicroservices   jax-london2020Cloud nativemicroservices   jax-london2020
Cloud nativemicroservices jax-london2020
 
XPages Blast - ILUG 2010
XPages Blast - ILUG 2010XPages Blast - ILUG 2010
XPages Blast - ILUG 2010
 
Spring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsugSpring Cloud Function & Project riff #jsug
Spring Cloud Function & Project riff #jsug
 
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~
Event-driven automation, DevOps way ~IoT時代の自動化、そのリアリティとは?~
 
Real time dashboards with Kafka and Druid
Real time dashboards with Kafka and DruidReal time dashboards with Kafka and Druid
Real time dashboards with Kafka and Druid
 
Always on! Or not?
Always on! Or not?Always on! Or not?
Always on! Or not?
 
Building a serverless company on AWS lambda and Serverless framework
Building a serverless company on AWS lambda and Serverless frameworkBuilding a serverless company on AWS lambda and Serverless framework
Building a serverless company on AWS lambda and Serverless framework
 
Intro to node and mongodb 1
Intro to node and mongodb   1Intro to node and mongodb   1
Intro to node and mongodb 1
 
Kubernetes security
Kubernetes securityKubernetes security
Kubernetes security
 

Más de Joshua Long

Economies of Scaling Software
Economies of Scaling SoftwareEconomies of Scaling Software
Economies of Scaling SoftwareJoshua Long
 
Bootiful Code with Spring Boot
Bootiful Code with Spring BootBootiful Code with Spring Boot
Bootiful Code with Spring BootJoshua Long
 
Microservices with Spring Boot
Microservices with Spring BootMicroservices with Spring Boot
Microservices with Spring BootJoshua Long
 
Have You Seen Spring Lately?
Have You Seen Spring Lately?Have You Seen Spring Lately?
Have You Seen Spring Lately?Joshua Long
 
Java Configuration Deep Dive with Spring
Java Configuration Deep Dive with SpringJava Configuration Deep Dive with Spring
Java Configuration Deep Dive with SpringJoshua Long
 
the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013Joshua Long
 
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonMulti Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonJoshua Long
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with SpringJoshua Long
 
the Spring 4 update
the Spring 4 updatethe Spring 4 update
the Spring 4 updateJoshua Long
 
Extending spring
Extending springExtending spring
Extending springJoshua Long
 
The spring 32 update final
The spring 32 update finalThe spring 32 update final
The spring 32 update finalJoshua Long
 
Integration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryIntegration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryJoshua Long
 
using Spring and MongoDB on Cloud Foundry
using Spring and MongoDB on Cloud Foundryusing Spring and MongoDB on Cloud Foundry
using Spring and MongoDB on Cloud FoundryJoshua Long
 
Spring in-the-cloud
Spring in-the-cloudSpring in-the-cloud
Spring in-the-cloudJoshua Long
 
Spring Batch Behind the Scenes
Spring Batch Behind the ScenesSpring Batch Behind the Scenes
Spring Batch Behind the ScenesJoshua Long
 
Cloud Foundry Bootcamp
Cloud Foundry BootcampCloud Foundry Bootcamp
Cloud Foundry BootcampJoshua Long
 
Extending Spring for Custom Usage
Extending Spring for Custom UsageExtending Spring for Custom Usage
Extending Spring for Custom UsageJoshua Long
 
Using Spring's IOC Model
Using Spring's IOC ModelUsing Spring's IOC Model
Using Spring's IOC ModelJoshua Long
 
Enterprise Integration and Batch Processing on Cloud Foundry
Enterprise Integration and Batch Processing on Cloud FoundryEnterprise Integration and Batch Processing on Cloud Foundry
Enterprise Integration and Batch Processing on Cloud FoundryJoshua Long
 

Más de Joshua Long (20)

Economies of Scaling Software
Economies of Scaling SoftwareEconomies of Scaling Software
Economies of Scaling Software
 
Bootiful Code with Spring Boot
Bootiful Code with Spring BootBootiful Code with Spring Boot
Bootiful Code with Spring Boot
 
Microservices with Spring Boot
Microservices with Spring BootMicroservices with Spring Boot
Microservices with Spring Boot
 
Boot It Up
Boot It UpBoot It Up
Boot It Up
 
Have You Seen Spring Lately?
Have You Seen Spring Lately?Have You Seen Spring Lately?
Have You Seen Spring Lately?
 
Java Configuration Deep Dive with Spring
Java Configuration Deep Dive with SpringJava Configuration Deep Dive with Spring
Java Configuration Deep Dive with Spring
 
the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013the Spring Update from JavaOne 2013
the Spring Update from JavaOne 2013
 
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy ClarksonMulti Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
Multi Client Development with Spring for SpringOne 2GX 2013 with Roy Clarkson
 
REST APIs with Spring
REST APIs with SpringREST APIs with Spring
REST APIs with Spring
 
the Spring 4 update
the Spring 4 updatethe Spring 4 update
the Spring 4 update
 
Extending spring
Extending springExtending spring
Extending spring
 
The spring 32 update final
The spring 32 update finalThe spring 32 update final
The spring 32 update final
 
Integration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud FoundryIntegration and Batch Processing on Cloud Foundry
Integration and Batch Processing on Cloud Foundry
 
using Spring and MongoDB on Cloud Foundry
using Spring and MongoDB on Cloud Foundryusing Spring and MongoDB on Cloud Foundry
using Spring and MongoDB on Cloud Foundry
 
Spring in-the-cloud
Spring in-the-cloudSpring in-the-cloud
Spring in-the-cloud
 
Spring Batch Behind the Scenes
Spring Batch Behind the ScenesSpring Batch Behind the Scenes
Spring Batch Behind the Scenes
 
Cloud Foundry Bootcamp
Cloud Foundry BootcampCloud Foundry Bootcamp
Cloud Foundry Bootcamp
 
Extending Spring for Custom Usage
Extending Spring for Custom UsageExtending Spring for Custom Usage
Extending Spring for Custom Usage
 
Using Spring's IOC Model
Using Spring's IOC ModelUsing Spring's IOC Model
Using Spring's IOC Model
 
Enterprise Integration and Batch Processing on Cloud Foundry
Enterprise Integration and Batch Processing on Cloud FoundryEnterprise Integration and Batch Processing on Cloud Foundry
Enterprise Integration and Batch Processing on Cloud Foundry
 

Último

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersRaghuram Pandurangan
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterMydbops
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 

Último (20)

The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
Generative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information DevelopersGenerative AI for Technical Writer or Information Developers
Generative AI for Technical Writer or Information Developers
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Scale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL RouterScale your database traffic with Read & Write split using MySQL Router
Scale your database traffic with Read & Write split using MySQL Router
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 

Spring in the Cloud - using Spring with Cloud Foundry

  • 1. Spring and Cloud Foundry: a Marriage Made in Heaven Josh Long, Spring Developer Advocate SpringSource, a division of VMware Twitter: @starbuxman Email: josh.long@springsource.com
  • 2. About Josh Long Spring Developer Advocate twitter: @starbuxman josh.long@springsource.com NOT CONFIDENTIAL -- TELL EVERYONE 2
  • 3. Spring Makes Building Applications Easy... NOT CONFIDENTIAL -- TELL EVERYONE 3
  • 4. Tell Spring About Your Objects package the.package.with.beans.in.it; @Service public class CustomerService { public Customer createCustomer(String firstName, String lastName, Date signupDate) { } ... } 4
  • 5. I want Database Access ... with Hibernate 4 Support package the.package.with.beans.in.it; ... @Service public class CustomerService { @Inject private SessionFactory sessionFactory; public Customer createCustomer(String firstName, String lastName, Date signupDate) { Customer customer = new Customer(); customer.setFirstName(firstName); customer.setLastName(lastName); customer.setSignupDate(signupDate); sessionFactory.getCurrentSession().save(customer); return customer; } ... } 5
  • 6. I want Declarative Transaction Management... package the.package.with.beans.in.it; ... @Service public class CustomerService { @Inject private SessionFactory sessionFactory; @Transactional public Customer createCustomer(String firstName, String lastName, Date signupDate) { Customer customer = new Customer(); customer.setFirstName(firstName); customer.setLastName(lastName); customer.setSignupDate(signupDate); sessionFactory.getCurrentSession().save(customer); return customer; } ... } 6
  • 7. I want Declarative Cache Management... package the.package.with.beans.in.it; ... @Service public class CustomerService { @Inject private SessionFactory sessionFactory; @Transactional @Cacheable(“customers”) public Customer createCustomer(String firstName, String lastName, Date signupDate) { Customer customer = new Customer(); customer.setFirstName(firstName); customer.setLastName(lastName); customer.setSignupDate(signupDate); sessionFactory.getCurrentSession().save(customer); return customer; } } 7
  • 8. I want a RESTful Endpoint... package org.springsource.examples.spring31.web; .. @Controller public class CustomerController { @Inject private CustomerService customerService; @RequestMapping(value = "/customer/{id}", produces = MediaType.APPLICATION_JSON_VALUE) public @ResponseBody Customer customerById(@PathVariable("id") Integer id) { return customerService.getCustomerById(id); } ... } 8
  • 9. Spring’s aim: bring simplicity to Java development data web tier batch integration & access & service tier mobile processing messaging / NoSQL / RIA Big Data The Spring framework the cloud: lightweight traditional CloudFoundry tc Server WebSphere Google App Engine Tomcat JBoss AS Amazon Web Services Jetty WebLogic (on legacy versions, too!) 9
  • 10. Now we just need a platform... NOT CONFIDENTIAL -- TELL EVERYONE 10
  • 11. Cloud Foundry: Choice of Runtimes 11
  • 12. Frameworks and Runtimes Supported • Out of the Box • Java (.WAR files, on Tomcat. Spring’s an ideal choice here, of course..) • Scala (Lift, Play!) • Ruby (Rails, Sinatra, etc.) • Node.js • Ecosystem Partners • .NET (Uhuru, Tier3) • both from Seattle-native partners! • Runs standard .NET (no need to port your application) • Python (Stackato) • PHP (AppFog) • Haskell (1) • Erlang (2) 1) http://www.cakesolutions.net/teamblogs/2011/11/25/haskell-happstack-on-cloudfoundry/ 2) https://github.com/cloudfoundry/vcap/pull/20 12
  • 13. Manifests --- applications: target: name: html5expenses url: ${name}.${target-base} framework: name: spring info: mem: 512M description: Java SpringSource Spring Application exec: mem: 512M instances: 1 services: expenses-mongo: type: :mongodb expenses-postgresql: type: :postgresql
  • 14. Demo: Deploying an Application ...from vmc with and without manifest.yml ...from STS NOT CONFIDENTIAL -- TELL EVERYONE 14
  • 15. Cloud Foundry: Choice of Clouds 15
  • 16. Main Risk: Lock In Welcome to the hotel california Such a lovely place Such a lovely face Plenty of room at the hotel california Any time of year, you can find it here Last thing I remember, I was Running for the door I had to find the passage back To the place I was before ’relax,’ said the night man, We are programmed to receive. You can checkout any time you like, But you can never leave! -the Eagles 16
  • 19. Cloud Foundry: Clouds  AppFog.com • community lead for PHP • PaaS for PHP  Joyent • community lead for Node.js  ActiveState • community lead for Python, Perl • Providers of Stackato private PaaS 19
  • 20. Cloud Foundry Community Foundry.org 20
  • 21. Micro Cloud Foundry (beta) Micro Cloud Foundry
  • 23. Cloud Foundry: Services  Services are one of the extensibility planes in Cloud Foundry • there are more services being contributed by the community daily!  MySQL, Redis, MongoDB, RabbitMQ, PostgreSQL  Services may be shared across applications  Cloud Foundry abstracts the provisioning aspect of services through a uniform API hosted in the cloud controller  It’s very easy to take an app and add a service to the app in a uniform way • Cassandra? COBOL / CICS, Oracle 23
  • 24. Cloud Foundry: Services  Take Advantage of Services • they cost nothing to setup • they deliver value  They Encourage Better Architectures • Need a fast read-write cache? Redis is ready to go! • Need to store long-tail documents? Give MongoDB a try • Need to decouple what applications do from when they do it? Use messaging and RabbitMQ 24
  • 25. Spring’s the Best Toolkit for Your Services  Spring Data • supports advanced JPA, MongoDB, Redis connectivity  Spring AMQP, Spring Integration • Supports messaging, and event-driven architectures  Spring core • Has best-of-breed support for RDBMS access, be it through JPA, JDBC, JDO, Hibernate, etc. 25
  • 26. Let’s Talk About Spring, Baby... NOT CONFIDENTIAL -- TELL EVERYONE 26
  • 27. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 28. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 29. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 30. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 31. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 32. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 33. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 34. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 35. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 36. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 37. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 38. Tangent: Quick Primer on Java Configuration in Spring 3.1 .... <beans> <tx:annotation-driven transaction-manager = "txManager" /> <context:component-scan base-package = "org.springsource.examples.spring31.services" /> <context:property-placeholder properties = "config.properties" /> <bean id = "txManager" class = "org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name = "sessionFactory" ref = "mySessionFactory" /> </bean> <bean id = "sessionFactory" class = "org.springframework.orm.hibernate4.LocalSessionFactoryBean"> ... </bean> </beans>
  • 39. Tangent: Quick Primer on Java Configuration in Spring 3.1 @Configuration @PropertySource("/config.properties") @EnableTransactionManagement @ComponentScan(basePackageClasses = {CustomerService.class}) public class ServicesConfiguration { @Bean public PlatformTransactionManager txManager() throws Exception { return new HibernateTransactionManager(this.sessionFactory()); } @Bean public SessionFactory sessionFactory() { ... } }
  • 40. The 80% Case NOT CONFIDENTIAL -- TELL EVERYONE 40
  • 41. Auto-Reconfiguration  Solves the 80% Case  Application works on Tomcat, connects to an RDBMS, uses Spring  Cloud Foundry Supports This out of the Box • Auto reconfiguration  Supported by many technologies (Spring, Ruby, Grails, Lift, etc.)
  • 42. Auto-Reconfiguration  Detects common Java beans: • DataSource • RedisConnectionFactory • RabbitConnectionFactory • Mongo  hibernate.dialect property becomes MySQLDialect, PostgreSQLDialect • org.springframework.orm.jpa.AbstractEntityManagerFactoryBean • org.springframework.orm.hibernate3.AbstractSessionFactoryBean (Spring 2.5 and 3.0) • org.springframework.orm.hibernate3.SessionFactoryBuilderSupport (Spring 3.1)  Cloud Foundry installs a BeanFactoryPostProcessor 42
  • 43. The cloud namespace NOT CONFIDENTIAL -- TELL EVERYONE 43
  • 44. the cloud Namespace  <cloud:> namespace for use in Spring app contexts  Provides application-level control of bean service bindings  Use when you have multiple... • services of the same type • beans of the same type, e.g.: DataSource, MongoDBFactory  Use when you have custom bean configuration • data source pool size, connection properties 44
  • 45. <cloud:data-source>  Configures a DataSource bean • Commons DBCP or Tomcat DataSource  Basic attributes: • id: defaults to service name • service-name: only needed if you have multiple relational database services bound to the app <cloud:data-source id="dataSource"/> <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="dataSource" ref="dataSource"/> </bean> 45
  • 46. <cloud:data-source>  Configures a DataSource bean • Commons DBCP or Tomcat DataSource  Basic attributes: • id: defaults to service name • service-name: only needed if you have multiple relational database services bound to the app <cloud:data-source id="dataSource"/> <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="dataSource" ref="dataSource"/> </bean> 46
  • 47. <cloud:data-source> Example <cloud:data-source id="dataSource" service-name="mySQLSvc"> <cloud:pool pool-size="1-5"/> <cloud:connection properties="charset=utf-8"/> </cloud:data-source> ... @Autowired private DataSource dataSource ; 47
  • 48. <cloud:properties> <cloud:properties id="cloudProperties" /> <context:property-placeholder properties-ref="cloudProperties"/> @Autowired private Environment environment; @Bean public ComboPooledDataSource dataSource() throws Exception { String user = this.environment.getProperty ("cloud.services.mysql.connection.username"); ComboPooledDataSource cpds = new ComboPooledDataSource(); cpds.setUser(user); return cpds; } 48
  • 49. Using the CloudEnvironment API NOT CONFIDENTIAL -- TELL EVERYONE 49
  • 50. The Spring Developer’s Perspective: The Environment $VCAP_SERVICES: {"redis-2.2": [{"name":"redis_sample","label":"redis-2.2","plan":"free", "tags":["redis","redis-2.2","key-value","nosql"], "credentials": {"hostname":"172.30.48.40", "host":"172.30.48.40", "port":5023, "password":"8e9a901f-987d-4544-9a9e-ab0c143b5142", "name":"de82c4bb-bd08-46c0-a850-af6534f71ca3"} }], "mongodb-1.8":[{"name":"mongodb- e7d29","label":"mongodb-1.8","plan":"free","tags”:…………………. 50
  • 51. Giving Your Application Clues with the env command env <appname> List application environment variables env-add <appname> <variable[=]value> Add an environment variable to an application env-del <appname> <variable> Delete an environment variable to an application $ env-add html5expenses PAYMENT_GATEWAY=http://blah.com is the same as.. $ export PAYMENT_GATEWAY=http://blah.com 51
  • 52. The Spring Developer’s Perspective: The Environment <dependency> <groupId>org.cloudfoundry</groupId> <artifactId>cloudfoundry-runtime</artifactId> <version>0.8.1</version> </dependency> 52
  • 53. The Spring Developer’s Perspective: The Environment CloudEnvironment e = new CloudEnvironment(); Iterable<RdbmsServiceInfo> dsServiceInformation = e.getServiceInfos( RdbmsServiceInfo.class) ; Iterable<RedisServiceInfo> redisServiceInformation = e.getServiceInfos( RedisServiceInfo.class) ; Iterable<RabbitServiceInfo> rabbitServiceInformation = e.getServiceInfos( RabbitServiceInfo.class) ; 53
  • 54. Using ServiceCreator //Provides access to CF service and application env info CloudEnvironment environment = new CloudEnvironment(); //Retrieve env info for bound service named "mysqlService" RdbmsServiceInfo mysqlSvc = environment.getServiceInfo("mysqlService", RdbmsServiceInfo.class); //create a DataSource bound to the service RdbmsServiceCreator dataSourceCreator = new RdbmsServiceCreator(); DataSource dataSource = dataSourceCreator.createService(mysqlSvc); 54
  • 55. Using ServiceInfo //Provides access to CF service and application env info CloudEnvironment environment = new CloudEnvironment(); //Retrieve env info for bound service named "mongoService" MongoServiceInfo mongoSvc = environment.getServiceInfo("mongoService", MongoServiceInfo.class); //create a Mongo DB bound to the service Mongo mongoDB = new Mongo(mongoSvc.getHost(), mongoSvc.getPort()); 55
  • 56. Demo: Scaling with vmc instances and CloudEnvironment NOT CONFIDENTIAL -- TELL EVERYONE 56
  • 57. One Binary to Rule Them All NOT CONFIDENTIAL -- TELL EVERYONE 57
  • 58. Spring 3.1 Profiles ... <beans ....>  In Development = “default”> <beans profile <ds:embedded-database id= "dataSource" type = “H2” /> </beans>  In Production <beans profile = “cloud”> <cloud:data-source id="dataSource"/> </beans> </beans> 58
  • 59. Spring 3.1 Profiles ... <beans ....> <beans profile = “dev”> <ds:embedded-database id= "dataSource" type = “H2” /> </beans> <beans profile = “cloud”> <cloud:data-source id="dataSource"/> </beans> </beans> 59
  • 60. Spring 3.1 Profiles  “cloud” profile automatically activates on Cloud Foundry • usage of the cloud namespace should occur within the cloud profile block 60
  • 61. Demo: Look at a Multi-Env Application with H2 and PostgreSQL NOT CONFIDENTIAL -- TELL EVERYONE 61
  • 62. A Running Tour of Some Useful Spring’s APIs NOT CONFIDENTIAL -- TELL EVERYONE 62
  • 63. Using MongoDB from Cloud Foundry NOT CONFIDENTIAL -- TELL EVERYONE 63
  • 64. Using MongoDB from Cloud Foundry <cloud:mongo-db-factory id="mongoFactory" service-name="mongo1" write-concern="SAFE" > <cloud:mongo-options connections-per-host="..." max-wait-time="..." /> </cloud:mongo-db-factory> for a sophisticated example, check out http://www.github.com/SpringSource/cloudfoundry-samples/cross-store NOT CONFIDENTIAL -- TELL EVERYONE 64
  • 65. Demo: Cross Store Persistence with MongoDB on Cloud Foundry NOT CONFIDENTIAL -- TELL EVERYONE 65
  • 66. the ORIGINAL “Cloud Scale Messaging” 66
  • 67. RabbitMQ – Messaging that Just Works Robust High-performance Easy to use AMQP LEADER
  • 68. Why AMQP? A Protocol, not an API •A defined set of messaging capabilities called the AMQ model •A network wire-level protocol, AMQP On commodity hardware •10-25 thousand messages per second is routine * •The NIC is usually the bottleneck 17 * Non-persistent messages
  • 69. Spring AMQP  Encapsulates low-level details  Simplifies sending and receiving Producer Consumer of messages Amqp Listener Template Container Spring AMQP AMQP
  • 70. Sending AMQP messages @Component public class MessageSender { @Autowired private volatile AmqpTemplate amqpTemplate; public void send(String message) { this.amqpTemplate.convertAndSend( "myExchange", "some.routing.key", message); } } 70
  • 71. Receiving AMQP messages public class MyComponent { @Autowired private AmqpTemplate amqpTemplate; public void read() throws Exception { ... String value = amqpTemplate.receiveAndConvert("myQueueName"); ... } } 71
  • 72. Spring AMQP: SimpleMessageListenerContainer  Asynchronous message receiver  POJO handlers  Handles re-connection and listener failure (rollback, redelivery)  Message conversion and error handling strategies <listener-container connection-factory="rabbitConnectionFactory"> <listener ref="handler" method="handle" queue-names="my.queue"> </listener-container> 72
  • 73. Using Redis from Cloud Foundry as a CacheManager @Bean public CacheManager cacheManager() throws Exception { return new RedisCacheManager(redisTemplate()); } NOT CONFIDENTIAL -- TELL EVERYONE 73
  • 74. Demo: Implementing Caching in the Cloud add data, remove some data, request data $> vmc tunnel redis keys * NOT CONFIDENTIAL -- TELL EVERYONE 74
  • 75. CloudFoundry.com signup promo code: cloudtalk Questions? Say hi on Twitter: @starbuxman NOT CONFIDENTIAL -- TELL EVERYONE @springsource @cloudfoundry

Notas del editor

  1. \n
  2. Hello, thank you or having me. Im pleased to have the opportunity to introduce you today to Spring and the SpringSource Tool Suite \n\nMy anem is Josh Long. I serve as the developer advocate for the Spring framework. I&amp;#x2019;ve used it in earnest and advocated it for many years now. i&amp;#x2019;m an author on 3 books on the technology, as well as a comitter to many of the Spring projects. Additionally, I take community activism very seriously and do my best to participate in the community. Sometimes this means answering question on Twitter, or in the forums, or helping contribute to the InfoQ.com and Artima.com communities\n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. these different framerworks let u tackle any problem youre likely to want to solve today \n- we support javee1.4 + 1.5 + 1.6; \n\nsits above target platform \nruns in cloud \n\n
  16. \n
  17. \n
  18. \n
  19. This is what happens when you run the command.\n
  20. \n
  21. \n
  22. This is what happens when you run the command.\n
  23. This is what happens when you run the command.\n
  24. This is what happens when you run the command.\n
  25. This is what happens when you run the command.\n
  26. - the nice part about CF is that you can scale each of these parts out independently: need 4 MySQL instances and 2 web servers? No problem.\n - its easy to create complex topologies \n
  27. - we can provide a Roo shell script that sets up a simple domain model and web application so that you don&amp;#x2019;t spend time building the Roo application in the demo.\n - note that you can deploy to a public cloud (perhaps, CloudFoundry.com), or to any other CloudFoundry project cloud local or otherwise\n - note that you don&amp;#x2019;t need to do anything to the DS in the default case: CF will introspect the Spring framework configuration and auto-stage the DS.\n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. Mention replacement vs adjustment - other properties not preserved. Emphasize any impl and format of bean def\n
  62. \n
  63. Auto-reconfig is good but some limitations and meant to get you up and running quickly\n
  64. Mention all cloud namespace elements create same bean types as auto-reconfig and thus have same classpath reqs\nsimilar to component scanning in Spring\n
  65. \n
  66. \n
  67. \n
  68. \n
  69. Go beyond what we offer with easy access to or an obcure\n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. This allows more flexibility in picking which bean to create, setting properties, etc. Doesn&amp;#x2019;t require Spring Data. Doesn&amp;#x2019;t require Spring (since could just use cloud properties injection instead of lookup from CloudEnvironment)\n
  77. \n
  78. \n
  79. \n\n
  80. \n\n
  81. \n
  82. \n
  83. \n
  84. \n
  85. \n
  86. \n
  87. \n
  88. One very popular open-source, message broker is RabbitMQ.\nIt designed to be robust, have high performance and be easy to use.\n\n
  89. An interesting feature of RabbitMQ is that it implements a standard messaging protocol called AMQP.\nThis is quite different than JMS where each JMS implementation had its own java client libraries.\nAMQP is an efficient wire level protocol and is supported by multiple message brokers.\nThere are clients in multiple languages.\n\n
  90. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  91. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  92. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  93. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  94. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  95. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  96. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  97. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  98. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  99. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  100. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  101. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  102. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  103. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  104. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  105. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  106. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  107. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  108. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  109. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  110. The AMQP messaging model is a little different to JMS, for example.\n\nProducers write a message to an exchange\nConsumers read from a queue that is bound to exchange.\n\nWhether a message written to an exchange ends up in queue depends on the type of the exchange.\nThere are a few different types of exchange.\n\nOne standard type is the fanout exchange.\nA fanout exchange writes a message to all of the queues that are bound to it.\n\n
  111. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  112. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  113. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  114. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  115. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  116. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  117. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  118. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  119. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  120. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  121. There is also a direct exchange.\nProducers write a message along with a routing key.\nQueues are bound to the exchange with a binding.\nif a message&amp;#x2019;s routing key matches the binding then the message is written to that queue.\n\n
  122. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  123. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  124. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  125. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  126. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  127. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  128. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  129. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  130. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  131. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  132. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  133. There are also topic exchanges, which basically implement pub/sub.\nHere the binding is can contain wildcards that are used to match against the message&amp;#x2019;s routing key\n
  134. Spring AMQP is a project, which provides wrapper classes that simplify the development of messaging applications.\n
  135. AmqpTemplate defines a method for sending messages\n
  136. AmqpTemplate defines a method for receiving messages\n
  137. There is also a SimpleMessageListenerContainer that will automatically invoke your POJO each time a message arrives in a queue.\n
  138. \n
  139. \n
  140. \n
  141. \n
  142. Refer back to Ramnivas&amp;#x2019; early JSON env example\n
  143. \n
  144. \n
  145. \n
  146. \n