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
Thursday, July 26, 12
Spring and Cloud Foundry: a Marriage Made in Heaven Josh Long, - - PowerPoint PPT Presentation
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 Thursday, July 26, 12 About Josh Long Spring Developer Advocate
SpringSource, a division of VMware Twitter: @starbuxman Email: josh.long@springsource.com
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
2
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
3
Thursday, July 26, 12
4
package the.package.with.beans.in.it; @Service public class CustomerService { public Customer createCustomer(String firstName, String lastName, Date signupDate) { } ... }
Thursday, July 26, 12
5
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; } ... }
Thursday, July 26, 12
6
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; } ... }
Thursday, July 26, 12
7
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; } }
Thursday, July 26, 12
8
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); } ... }
Thursday, July 26, 12
9
web tier & RIA service tier batch processing integration & messaging data access / NoSQL / Big Data mobile tc Server Tomcat Jetty
CloudFoundry Google App Engine Amazon Web Services
WebSphere JBoss AS WebLogic
(on legacy versions, too!)
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
10
Thursday, July 26, 12
11 Thursday, July 26, 12
12
1) http://www.cakesolutions.net/teamblogs/2011/11/25/haskell-happstack-on-cloudfoundry/ 2) https://github.com/cloudfoundry/vcap/pull/20
Thursday, July 26, 12
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
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
14
Thursday, July 26, 12
15 Thursday, July 26, 12
16
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!
Thursday, July 26, 12
17
Thursday, July 26, 12
Thursday, July 26, 12
19
Thursday, July 26, 12
20
Thursday, July 26, 12
Thursday, July 26, 12
22 Thursday, July 26, 12
23
Thursday, July 26, 12
Use messaging and RabbitMQ
24
Thursday, July 26, 12
Hibernate, etc.
25
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
26
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
.... <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>
Thursday, July 26, 12
@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() { ... } }
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
40
Thursday, July 26, 12
Thursday, July 26, 12
(Spring 2.5 and 3.0)
(Spring 3.1)
42
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
43
Thursday, July 26, 12
44
Thursday, July 26, 12
the app
45
<cloud:data-source id="dataSource"/> <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="dataSource" ref="dataSource"/> </bean>
Thursday, July 26, 12
the app
46
<cloud:data-source id="dataSource"/> <bean class="org.sf.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="dataSource" ref="dataSource"/> </bean>
Thursday, July 26, 12
47
Thursday, July 26, 12
48
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
49
Thursday, July 26, 12
50
Thursday, July 26, 12
51
env <appname> List application environment variables env-add <appname> <variable[=]value> env-del <appname> <variable> Add an environment variable to an application 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
Thursday, July 26, 12
52
Thursday, July 26, 12
53
Thursday, July 26, 12
54
//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);
Thursday, July 26, 12
55
//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());
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
56
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
57
Thursday, July 26, 12
58
Thursday, July 26, 12
59
Thursday, July 26, 12
60
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
61
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
62
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
63
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
64
<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>
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
65
Thursday, July 26, 12
66
Thursday, July 26, 12
Thursday, July 26, 12
17
Thursday, July 26, 12
Producer
Spring AMQP AMQP Amqp Template
Consumer
Listener Container
Thursday, July 26, 12
70
Thursday, July 26, 12
71
public class MyComponent { @Autowired private AmqpTemplate amqpTemplate; public void read() throws Exception { ... String value = amqpTemplate.receiveAndConvert("myQueueName"); ... } }
Thursday, July 26, 12
l Asynchronous message receiver l POJO handlers l Handles re-connection and listener failure (rollback, redelivery) l Message conversion and error handling strategies
72
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
73
@Bean public CacheManager cacheManager() throws Exception { return new RedisCacheManager(redisTemplate()); }
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
74
Thursday, July 26, 12
NOT CONFIDENTIAL -- TELL EVERYONE
CloudFoundry.com signup promo code: cloudtalk
Thursday, July 26, 12