RESTfully Async with Grails 2.3 By Graeme Rocher

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Friday, September 13, 13

RESTfully Async with Grails 2.3 By Graeme Rocher

© 2013 SpringOne 2GX. All rights reserved. Do not distribute without permission.

Friday, September 13, 13

SPRING IO EXECUTION:

Grails

Friday, September 13, 13

Agenda § Detailed Look at REST § Fun with Grails Async APIs § Summary / Q & A

Friday, September 13, 13

Goals of REST Support in Grails 2.3

• • • •

Be Grails-y (i.e. dead simple) Be Flexible (start simple, get deep) Be pluggable (extend and conquer) Be current (support latest techniques)

5 Friday, September 13, 13

2.3

REST Features in 2.3

• RESTful URL Mappings • Domain Classes as REST resources • Controllers as REST resources • Renderers and Binders

6 Friday, September 13, 13

2.3

GRAILS

Demo Domain classes as REST resources

Friday, September 13, 13

REST: @Resource Transformation • Automatically exposes a domain class as a REST resource • Configurable formats • Configuration HTTP methods

8 Friday, September 13, 13

REST: @Resource Transformation • Automatically exposes a domain class as a REST resource • Configurable formats • Configuration HTTP methods

8 Friday, September 13, 13

import  grails.rest.* @Resource class  Person  {        String  name }

GRAILS

Demo RESTful URL Mappings

Friday, September 13, 13

REST: URL Mappings • RESTful Mappings – Single or Multiple resources – Versioning – Nested resources

• New url-mappings-report command to mappings

10 Friday, September 13, 13

REST: Multiple Resources

HTTP Method

URI

Action

GET

/books

index

POST

/books

save

GET

/books/${id}

show

PUT

/books/${id}

update

DELETE

/books/${id}

delete

11 Friday, September 13, 13

REST: Multiple Resources "/books"(resources:'book')   HTTP Method

URI

Action

GET

/books

index

POST

/books

save

GET

/books/${id}

show

PUT

/books/${id}

update

DELETE

/books/${id}

delete

11 Friday, September 13, 13

REST: Singular Resources

HTTP Method

URI

Action

GET

/book

show

POST

/book

save

PUT

/book

update

DELETE

/book

delete

12 Friday, September 13, 13

REST: Singular Resources "/book"(resource:'book')  

HTTP Method

URI

Action

GET

/book

show

POST

/book

save

PUT

/book

update

DELETE

/book

delete

12 Friday, September 13, 13

GRAILS

Demo Nested Resources

Friday, September 13, 13

REST: Nested URL Mappings • You can nest resources or other URL mappings within resources

14 Friday, September 13, 13

REST: Nested URL Mappings • You can nest resources or other URL mappings within resources "/books"(resources:'book')  {    "/authors"(resources:"author") } "/books"(resources:  "book")  {        "/publisher"(controller:"publisher") } 14 Friday, September 13, 13

REST: Nested Resources

HTTP Method

URI

Action

GET

/books/${bookId}/authors

index

POST

/books/${bookId}/authors

save

GET

/books/${bookId}/authors/${id}

show

PUT

/books/${bookId}/authors/${id}

update

DELETE

/books/${bookId}/authors/${id}

delete

15 Friday, September 13, 13

REST: Nested Resources "/books"(resources:'book')  {    "/authors"(resources:"author") } HTTP Method

URI

Action

GET

/books/${bookId}/authors

index

POST

/books/${bookId}/authors

save

GET

/books/${bookId}/authors/${id}

show

PUT

/books/${bookId}/authors/${id}

update

DELETE

/books/${bookId}/authors/${id}

delete

15 Friday, September 13, 13

GRAILS

Demo Versioned Resources

Friday, September 13, 13

REST: Versioned Resources • Version by URI • Version by “Accept-Version” header • Version by Media Type

17 Friday, September 13, 13

REST: Versioned Resources • Version by URI • Version by “Accept-Version” header • Version by Media Type

"/books"(version:'1.0',  resources:"book") "/books"(version:'2.0',  resources:"bookV2")

17 Friday, September 13, 13

GRAILS

Demo Controllers as REST resources

Friday, September 13, 13

REST: RestfulController Super Class • Implements methods for all the typical REST operations (save, delete etc.) • Subclasses can override / augment as necessary

19 Friday, September 13, 13

REST: RestfulController Super Class • Implements methods for all the typical REST operations (save, delete etc.) • Subclasses can override / augment as necessary import  grails.rest.* class  PersonController  extends  RestfulController{        PersonController()  {          super(Person)        } } 19 Friday, September 13, 13

REST: RestfulController for Nested Resources • Super class makes it easy to implement nested resources

20 Friday, September 13, 13

REST: RestfulController for Nested Resources • Super class makes it easy to implement nested resources class  PersonController  extends  RestfulController{ ... protected  queryForResource(Serializable  id)  { def  city  =  City.load(params.cityId)    Person.findByCityAndId(city,  id)           } } 20 Friday, September 13, 13

REST: Scaffolding 2.0 • Scaffolding support now a plugin – http://grails.org/plugin/scaffolding

• Generated controllers now RESTful • New generate-asynccontroller command for Async support

21 Friday, September 13, 13

GRAILS

Demo Renderers

Friday, September 13, 13

REST: Renderers • Rendering customizable in resources.groovy, just render a Spring bean • JSON, XML, HAL, Atom, Vnd.Error renders included • Renderer can use any library (Jackson, GSON etc.)

23 Friday, September 13, 13

REST: Renderers • Rendering customizable in resources.groovy, just render a Spring bean • JSON, XML, HAL, Atom, Vnd.Error renders included • Renderer can use any library (Jackson, GSON etc.) import  grails.rest.render.json.* beans  =  {   personRenderer(JsonRenderer,    Person)  {     excludes  =  ['class',  'age']   } } 23 Friday, September 13, 13

REST: What is a Render? • Class that implements the Renderer interface

24 Friday, September 13, 13

REST: What is a Render? • Class that implements the Renderer interface interface  Renderer  extends  MimeTypeProvider{        /**  @return  The  target  type    */        Class  getTargetType()        /**          *  Renders  the  object          */        void  render(T  object,  RenderContext  context) }

24 Friday, September 13, 13

REST: Container Renderers • Container renderers render containers (Lists, Maps, Errors) of a particular type • You want different output from a single resources vs viewing multiple

25 Friday, September 13, 13

REST: Container Renderers • Container renderers render containers (Lists, Maps, Errors) of a particular type • You want different output from a single resources vs viewing multiple interface  ContainerRenderer   extends  Renderer{        /*  The  generic  type  of  the  container*/        Class  getComponentType() }

25 Friday, September 13, 13

GRAILS

Demo Hypermedia & Mime / Media Types

Friday, September 13, 13

REST: Hyper Media and Mime Types • Declare Mime Types in Config.groovy • Don’t declare new types first!

27 Friday, September 13, 13

REST: Hyper Media and Mime Types • Declare Mime Types in Config.groovy • Don’t declare new types first! grails.mime.types  =  [        all:                      '*/*',        person:  "application/vnd.foo.org.person+json",        people:    "application/vnd.foo.org.people+json",        

27 Friday, September 13, 13

REST: Hyper Media and Mime Types • Define Renderers that use those types in resources.groovy

28 Friday, September 13, 13

REST: Hyper Media and Mime Types • Define Renderers that use those types in resources.groovy def  personMimeType  =        new  MimeType("application/vnd.foo.org.person+json") beans  =  {   personRenderer(JsonRenderer,                    Person,                    personMimeType) }

28 Friday, September 13, 13

GRAILS

Demo Versioning with Hyper Media

Friday, September 13, 13

REST: Hyper Media Versioning • You can version custom media types and use the media type to render different outputs

30 Friday, September 13, 13

REST: Hyper Media Versioning • You can version custom media types and use the media type to render different outputs def  personMimeType  =        new  MimeType("application/vnd.foo.org.person+json",      [v:  "1.0"]  ) beans  =  {   personRenderer(JsonRenderer,                    Person,                    personMimeType) }

30 Friday, September 13, 13

GRAILS

Demo HAL Support

Friday, September 13, 13

REST: Hyper Media with HAL • HAL is a standardized format used in conjunction with HATEOS principals

32 Friday, September 13, 13

REST: Hyper Media with HAL • HAL is a standardized format used in conjunction with HATEOS principals def  personMimeType  =        new  MimeType("application/vnd.foo.org.person+json",      [v:  "1.0"]  ) beans  =  {   personRenderer(HalJsonRenderer,                    Person,                    personMimeType) }

32 Friday, September 13, 13

GRAILS

Demo Binders / BindingSource

Friday, September 13, 13

REST: Binding / BindingSource • If you define a custom render you may need to define a custom binding source to make binding work

34 Friday, September 13, 13

REST: Binding / BindingSource • If you define a custom render you may need to define a custom binding source to make binding work protected  DataBindingSource                          createBindingSource(Reader  reader)  {   def  json  =  JSON.parse(reader)   def  map  =  [     firstName:json.first_name,     lastName:json.last_name   ]   new  SimpleMapDataBindingSource(map) }

34 Friday, September 13, 13

Goals of Async Support in Grails 2.3

• • • •

Be Grails-y (i.e. dead simple) Be Flexible (start simple, get deep) Be pluggable (extend and conquer) Be current (support latest techniques)

35 Friday, September 13, 13

2.3

Async Features in 2.3

• Async Primitives (Promises, Lists, Maps etc.) • Async Data (GORM) • Async Everywhere (Tasks) • Async Request Handling

36 Friday, September 13, 13

2.3

GRAILS

Demo Async Primitives

Friday, September 13, 13

Async: Promise Primitives • Foundational API for Async programming • Includes notion of Promise • Ability to combine / chain promises

38 Friday, September 13, 13

Async: Promise Primitives • Foundational API for Async programming • Includes notion of Promise • Ability to combine / chain promises

38 Friday, September 13, 13

import  static   grails.async.Promises.* def  p1  =  task  {  2  *  2  } def  p2  =  task  {  4  *  4  } def  p3  =  task  {  8  *  8  } assert  [  4,  16,  64  ]  ==   waitAll(p1,  p2,  p3)

Async: Promise Chaining • Chain promises to formulate a value asynchronously

39 Friday, September 13, 13

Async: Promise Chaining • Chain promises to formulate a value asynchronously import  static  grails.async.Promises.* import  static  grails.async.* Promise  p  =        task  {  2  *  2  }  <<  {  it  *  4  }  <<  {  it  *  8  } p.onComplete  {  Integer  value  -­‐>        println  "Total:  $value" }   39 Friday, September 13, 13

Async: Promise Chaining • Create list and map data structures from promises!

40 Friday, September 13, 13

Async: Promise Chaining • Create list and map data structures from promises! import  static  grails.async.Promises.* import  static  grails.async.* PromiseList  p  =        task  {  2  *  2  }  <<  {  it  *  4  }  <<  {  it  *  8  } p.onComplete  {  Integer  value  -­‐>        println  "Total:  $value" }   40 Friday, September 13, 13

Async: Promise Factory • Override the creation of promise instances – Plugin in Reactor – Change to synchronous promises for testing

41 Friday, September 13, 13

Async: Promise Factory • Override the creation of promise instances – Plugin in Reactor – Change to synchronous promises for testing import  org.grails.async.factory.* import  grails.async.* Promises.promiseFactory  =      new  SynchronousPromiseFactory()

41 Friday, September 13, 13

Async: @DelegateAsync Transform • Transform any synchronous API into an asynchronous one • Takes each method and returns a promise

42 Friday, September 13, 13

Async: @DelegateAsync Transform • Transform any synchronous API into an asynchronous import  grails.async.* one • Takes each method and class  AsyncBookService  { returns a promise      @DelegateAsync        BookService  bookService }

42 Friday, September 13, 13

GRAILS

Demo Async Data (GORM)

Friday, September 13, 13

Async: GORM • Makes all GORM methods async • Each method returns a Promise • Deals with binding session to background thread • Works across all datastores (MongoDB, GORM for REST etc.) 44 Friday, September 13, 13

Async: GORM • Makes all GORM methods async • Each method returns a Promise • Deals with binding session to background thread • Works across all datastores (MongoDB, GORM for REST etc.) 44 Friday, September 13, 13

def  p1  =  Person.async.get(1) def  p2  =  Person.async.get(2) def  p3  =  Person.async.get(3) def  results  =                waitAll(p1,  p2,  p3)

Async: GORM Tasks • Batch up a bunch of Grails queries to be executed asynchronously

45 Friday, September 13, 13

Async: GORM Tasks • Batch up a bunch of Grails queries to be executed asynchronously def  promise  =  Person.async.task  {        withTransaction  {              def  person  =  findByFirstName("Homer")              person.firstName  =  "Bart"              person.save(flush:true)                } } Person  updatedPerson  =  promise.get() 45 Friday, September 13, 13

GRAILS

Demo Async Request Handling

Friday, September 13, 13

Async: Request Processing • Handle requests asynchronously • Uses Servlet 3.0 async under the covers • Create asynchronous models

47 Friday, September 13, 13

Async: Request Processing • Handle requests asynchronously • Uses Servlet 3.0 async under the covers • Create asynchronous models

47 Friday, September 13, 13

import  static   grails.async.Promises.* class  PersonController  {    def  index()  {      tasks  books:  Book.async.list(),                total:  Book.async.count(),                otherValue:  {                      //  do  hard  work                }      } }

REST: Generating Async Controllers • New scaffolding can generate an example Async controller – http://grails.org/plugin/scaffolding

• Use generate-asynccontroller command

48 Friday, September 13, 13

Q&A REST & Async

3.0 Friday, September 13, 13

Learn More. Stay Connected.

Web: grails.org Twitter: twitter.com/grailsframework LinkedIn: http://linkedin.com/groups/Grails-User-Group-39757 Google +: https://plus.google.com/communities/ 109558563916416343008

Friday, September 13, 13

RESTfully Async with Grails 2.3 - GitHub

Sep 13, 2013 - Goals of REST Support in Grails 2.3 ... Be current (support latest techniques). 5 .... Define Renderers that use those types in resources.groovy.

5MB Sizes 7 Downloads 116 Views

Recommend Documents

Google Async Tracking Case Study
an opportunity to update the site's existing traditional Google Analytics snippet to the ... the cutting edge with Google's best practices, this was done to improve site speed ... region helps to determine marketing strategy and financing for various

grails in action pdf download
Retrying... Download. Connect more apps... Try one of the apps below to open or edit this item. grails in action pdf download. grails in action pdf download. Open.

Java with Generators - GitHub
processes the control flow graph and transforms it into a state machine. This is required because we can then create states function SCOPEMANGLE(node).

with ZeroMQ and gevent - GitHub
Normally, the networking of distributed systems is ... Service Oriented .... while True: msg = socket.recv() print "Received", msg socket.send(msg). 1. 2. 3. 4. 5. 6. 7.

Getting Started with CodeXL - GitHub
10. Source Code View . ..... APU, a recent version of Radeon Software, and the OpenCL APP SDK. This document describes ...... lel_Processing_OpenCL_Programming_Guide-rev-2.7.pdf. For GPU ... trademarks of their respective companies.

Async Buffered Disk IO using preadv2 with Samba PDF
There was a problem loading more pages. Async Buffered Disk IO using preadv2 with Samba PDF. Async Buffered Disk IO using preadv2 with Samba PDF.

Async Buffered Disk IO using preadv2 with Samba PDF
Page 3 of 8. IO thread pool pattern. Page 3 of 8. Async Buffered Disk IO using preadv2 with Samba PDF. Async Buffered Disk IO using preadv2 with Samba PDF.