Your SlideShare is downloading. ×
0
Google App Engine,
    Groovy Baby!
by Patrick Chanezon and Guillaume Laforge
         from Google and SpringSource
Learn about GAE/J and
                 how Groovy it can be!


                  Discover the Google App Engine for Java c...
Patrick Chanezon
                  Google Developer Advocate
                  @chanezon
www.devoxx.com
Guillaume Laforge
                 •   Groovy Project Manager
                 •   JSR-241 Spec Lead
                 •   ...
Agenda


    • What does it take to host a Java Web application?
    • Introducing Google App Engine for Java
    • App En...
What does it take (for a Java developer) to
    host a Web application?




4
Doing it yourself in Java is still complex!




5
Hosting with Java still means hidden costs


      • Idle capacity
      • Software patches & upgrades
      • License fee...
Google App Engine – now with Java!




         And it’s still…
                               • Easy to build
           ...
All the same services for Java App Engine as
    with Python




8
18+ months in review

         Apr 2008   Python launch
         May 2008   Memcache, Images API
         Jul 2008   Logs ...
Same Distributed web hosting platform




10
Same Distributed web hosting platform



     • Parallel processing
     • Scales automatically
     • Available globally
...
Same Distributed web hosting platform




      SCALABILITY
     for Java as well
12
Same Specialized services




13
Same App Engine Dashboard




14
Same initial free use policy as Python


     • ~5M pageviews/month
     • 6.5 CPU hrs/day
     • 1 GB storage
     • 650K...
App Engine and Java Standards




16
Based on Java Standards




17
Based on Java Standards




18
Extended Language support through JVM


      • Java
      • Scala
      • JRuby (Ruby)
      • Groovy
      • Quercus (PH...
Development Tools for Java App Engine




20
Google’s Complete Java Development Stack




                         +

21
Google Plugin for Eclipse




22
Google Plugin for Eclipse




23
NeatBeans Plugin for Java App Engine


           http://kenai.com/projects/nbappengine/




24
Demo


     • Lolcat Wave Robot
      – From the GWT client
        to a Google Wave Bot!




27
Demo

     • Demonstrating “Plane Crazy”
         • Uses DataStore for Airplane, Activities, People data
         • Uses e...
Limitations, Issues


     • No naked domains
     • No SSL for domains
     • First request for scripted languages is slo...
Roadmap


     • Storing/serving large files
     • Mapping operations across data sets
     • Datastore cursors
     • No...
Tips


     • Nick Johnson’s deferred lib article
       – http://code.google.com/appengine/articles/deferred.html
       ...
Scala


     • Modern language on top of VM (Java & .NET)
       – Statically typed
       – Traits -> Mixin style composi...
Scala/Lift


     • Scala’s Web Framework
        – Seaside's highly granular sessions and security
        – Rails fast f...
Scala/Lift

 Author.scala
 package net.liftweb.example.model

 import javax.persistence._
 import com.google.appengine.api...
JRuby

     • Ola Bini’s work on JRuby so that it works on appengine
       – Many presos and blogs about rails on GAE (IO...
JRuby


     • Don’t forget to replace net/http by the Google version
       – Based on UrlFetch instead of Sockets
     •...
Guestbook in JRuby

 guestbook.rb
 require 'sinatra'
 require 'dm-core'

 # Configure DataMapper to use the App Engine dat...
Guestbook in JRuby

     get '/' do
       # Just list all the shouts
       @shouts = Shout.all
       erb :index
     en...
Clojure


     • Lisp dialect on top of Java VM
     • Programming Clojure, Halloway, PragProg book
     • John Hume appen...
Guestbook in Clojure/Compojure

 (ns guestbook.servlet
   ... you no longer need to import UserServiceFactory ...
   (:req...
Tools: Emacs


     • clojure-mode, slime, swank
     • Setup tools:
        – http://riddell.us/tutorial/slime_swank/slim...
Wave Robot in Clojure

Jeff Foster http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html

(ns uk.co.fatvat.wave.par...
F
F
http://gaelyk.appspot.com




                            F
http://gaelyk.appspot.com




                            F
Gaelyk
                  Gaelyk is a lightweight Groovy toolkit on top of the
                  Google App Engine Java SDK...
Why Groovy?
                  Groovy is a dynamic language for the JVM
                    very flexible, malleable, expres...
MVC: Groovlets and templates

                     Groovlets                  Templates
                     (controllers)...
First steps...




•Go to http://gaelyk.appspot.com
•Download the template project
•Put your first Groovlet in /WEB-INF/gr...
The web.xml
                                                                                    ">
                    <we...
A groovlet
                  Instead of writing full-blown servlets, just write
                  Groovy scripts (aka Groo...
A template
                      <html>
                          <body>
                               <p><%
            ...
Shortcuts
                  Variables available       Google services
                    request / response        datast...
Groovy sugar!
Sending emails with Gaelyk

                    mail.send to: 'foobar@gmail.com',
                        from: 'other@gma...
...compared to Java
                 Properties props = new Properties();
                                                ...
Accessing the datastore
                  Direct interaction with the low-level datastore API
                            ...
Querying to be improved...
                   import com.google.appengine.api.datastore.*
                                ...
...into something groovier?

                     def entities = datastore.createQuery {
                         select f...
...into something groovier?

                     def entities = datastore.createQuery {
                         select f...
Task queue API
                     // access a configured queue using the subscript notation
                     queues[...
Jabber / XMPP support (1/3)
                  Sending instant messages

                       String recipient = "someone...
Jabber / XMPP support (2/3)
                  Sending instant messages with an XML payload
                     String rec...
Jabber / XMPP support (2/3)
                  Sending instant messages with an XML payload
                     String rec...
Jabber / XMPP support (3/3)
                  Receving incoming instant messages
                    Configure the XmppServ...
Memcache service
                  Map notation access to the cache

                                                     ...
What’s coming next?
                  A new Gaelyk 0.3 release a couple days ago
                    Sugar for the Memcach...
DEMO




       www.devoxx.com
The use case
                  Collaboratively consolidated Twitter search
                  Send a search query to
      ...
www.devoxx.com
www.devoxx.com
www.devoxx.com
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                  p
                           mos @ap
                          e
             ...
spo t.com
                                              p
                                       mos @ap
                 ...
Summary
                  Easy access to a cloud solution
                     Deploying Java apps, as easily as you would...
Thanks for your attention!


                                      e                                             nezon cy ...
Images used in this presentation
                  Clouds
                        http://www.morguefile.com/archive/display...
Upcoming SlideShare
Loading in...5
×

Google App Engine Java, Groovy and Gaelyk

30,360

Published on

Patrick Chanezon and Guillaume Laforge are presenting Google App Engine Java and Gaelyk, the lightweight groovy toolkit on top of the GAE SDK, at the Devoxx conference

Published in: Technology
3 Comments
40 Likes
Statistics
Notes
No Downloads
Views
Total Views
30,360
On Slideshare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
644
Comments
3
Likes
40
Embeds 0
No embeds

No notes for slide
  • - Scalable web hosting platform
    - Built on Google technology
    - Utilizing the same infrastructure you already use each day
    * Return web search result &lt; 0.25s
  • Beneficios son los mismos del python
  • SPECIALIZATION =&gt; SCALABILITY
  • Show building an running apps in orkut, Ning, hi5..
  • Show building an running apps in orkut, Ning, hi5..
  • Transcript of "Google App Engine Java, Groovy and Gaelyk"

    1. 1. Google App Engine, Groovy Baby! by Patrick Chanezon and Guillaume Laforge from Google and SpringSource
    2. 2. Learn about GAE/J and how Groovy it can be! Discover the Google App Engine for Java cloud solution, and how Groovy and Gaelyk can make you more productive and bring you lots of fun coding your app in the cloud! www.devoxx.com
    3. 3. Patrick Chanezon Google Developer Advocate @chanezon www.devoxx.com
    4. 4. Guillaume Laforge • Groovy Project Manager • JSR-241 Spec Lead • Head of Groovy Development at SpringSource • Initiator of the Grails framework • Co-author of Groovy in Action • Speaker: JavaOne, QCon, JavaZone, Sun TechDays, Devoxx, The Spring Experience, SpringOne, JAX, www.devoxx.com Dynamic Language World, IJTC, and more...
    5. 5. Agenda • What does it take to host a Java Web application? • Introducing Google App Engine for Java • App Engine Review for Java – A Complete Java development stack • Demos • Limitations, Issues • Roadmap • Scala, Clojure, JRuby • Groovy • Gaelyk • Questions 3
    6. 6. What does it take (for a Java developer) to host a Web application? 4
    7. 7. Doing it yourself in Java is still complex! 5
    8. 8. Hosting with Java still means hidden costs • Idle capacity • Software patches & upgrades • License fees • IT staff server wrangling • Traffic & utilization forecasting • Upgrades 6
    9. 9. Google App Engine – now with Java! And it’s still… • Easy to build • Easy to maintain • Easy to scale 7
    10. 10. All the same services for Java App Engine as with Python 8
    11. 11. 18+ months in review Apr 2008 Python launch May 2008 Memcache, Images API Jul 2008 Logs export Aug 2008 Batch write/delete Oct 2008 HTTPS support Dec 2008 Status dashboard, quota details Feb 2009 Billing, larger files Apr 2009 Java launch, DB import, cron support, SDC May 2009 Key-only queries Jun 2009 Task queues Aug 2009 Kindless queries Sep 2009 XMPP Oct 2009 Incoming Email 9
    12. 12. Same Distributed web hosting platform 10
    13. 13. Same Distributed web hosting platform • Parallel processing • Scales automatically • Available globally • Configuration free • Built-in DoS protections 11
    14. 14. Same Distributed web hosting platform SCALABILITY for Java as well 12
    15. 15. Same Specialized services 13
    16. 16. Same App Engine Dashboard 14
    17. 17. Same initial free use policy as Python • ~5M pageviews/month • 6.5 CPU hrs/day • 1 GB storage • 650K URL Fetch calls • 2,000 recipients emailed • 1 GB/day bandwidth • N tasks 15
    18. 18. App Engine and Java Standards 16
    19. 19. Based on Java Standards 17
    20. 20. Based on Java Standards 18
    21. 21. Extended Language support through JVM • Java • Scala • JRuby (Ruby) • Groovy • Quercus (PHP) • Rhino (JavaScript) • Jython (Python) Duke, the Java mascot Copyright © Sun Microsystems Inc., all rights reserved. 19
    22. 22. Development Tools for Java App Engine 20
    23. 23. Google’s Complete Java Development Stack + 21
    24. 24. Google Plugin for Eclipse 22
    25. 25. Google Plugin for Eclipse 23
    26. 26. NeatBeans Plugin for Java App Engine http://kenai.com/projects/nbappengine/ 24
    27. 27. Demo • Lolcat Wave Robot – From the GWT client to a Google Wave Bot! 27
    28. 28. Demo • Demonstrating “Plane Crazy” • Uses DataStore for Airplane, Activities, People data • Uses email service for correspondence • Uses XMPP for simple chatbot access Live Demo: http://plane-crazy.appspot.com Source: http://code.google.com/p/plane-crazy-demo/ 28
    29. 29. Limitations, Issues • No naked domains • No SSL for domains • First request for scripted languages is slow • No MapReduce • NoSQL • No Sockets • No Long running processes • No Threads • no javax.image APIs • No Jax-WS • Limit # of File on Apps 29
    30. 30. Roadmap • Storing/serving large files • Mapping operations across data sets • Datastore cursors • Notification alerts for application exceptions • Datastore dump and restore facility 30
    31. 31. Tips • Nick Johnson’s deferred lib article – http://code.google.com/appengine/articles/deferred.html – Python but applies to Java – catch DeadlineExceededError and spawn a new task 31
    32. 32. Scala • Modern language on top of VM (Java & .NET) – Statically typed – Traits -> Mixin style composition – More functional style, but not bigot about it: closures – Concurrency: Actors – Type inference: less verbose than Java – Type System • Programming Scala, Wample & Payne, O’Reilly • People to follow: Jonas Boner, @debasishg, Dave Pollack, Alex Payne 32
    33. 33. Scala/Lift • Scala’s Web Framework – Seaside's highly granular sessions and security – Rails fast flash-to-bang – Django's "more than just CRUD is included" – Wicket's designer-friendly templating style (see Lift View First) • Lift in Appengine – Not all works: no Threads -> No Actors • David Pollack & al, Lift Getting started – http://liftweb.net/docs/getting_started/mod_master.html#x1-50001.3 • ymnk’s Books example – git://gist.github.com/98561.git 33
    34. 34. Scala/Lift Author.scala package net.liftweb.example.model import javax.persistence._ import com.google.appengine.api.datastore.Key @Entity class Author { @Id @GeneratedValue(){val strategy = GenerationType.IDENTITY} var id : Key = _ @Column{val nullable = false} var name : String = "" @OneToMany{val mappedBy = "author", val targetEntity=classOf[Book]} var books : java.util.List[Book] = _ } 34
    35. 35. JRuby • Ola Bini’s work on JRuby so that it works on appengine – Many presos and blogs about rails on GAE (IO talk) – Bumble / Datastore, BeeU / User service • Ryan Brown appengine-apis gem – http://code.google.com/p/appengine-jruby/ – Rack::AppEngine task – See their Railsconf talk • Rails works • Sinatra framework – sudo gem install sinatra • Sam Ruby Wave Robot in JRuby/Sinatra – http://intertwingly.net/blog/2009/06/07/Google-Wave-Robot-w- Sinatra-JRuby-AppEngine – Wave client lib 35
    36. 36. JRuby • Don’t forget to replace net/http by the Google version – Based on UrlFetch instead of Sockets • Curt Thompson of Best Buy’s Giftag.com – http://googleappengine.blogspot.com/2009/02/best-buys-giftag- on-app-engine.html – Real world use case 36
    37. 37. Guestbook in JRuby guestbook.rb require 'sinatra' require 'dm-core' # Configure DataMapper to use the App Engine datastore DataMapper.setup(:default, "appengine://auto") # Create your model class class Shout include DataMapper::Resource property :id, Serial property :message, Text end # Make sure our template can use <%=h helpers do include Rack::Utils alias_method :h, :escape_html end 37
    38. 38. Guestbook in JRuby get '/' do # Just list all the shouts @shouts = Shout.all erb :index end post '/' do # Create a new shout and redirect back to the list. shout = Shout.create(:message => params[:message]) redirect '/' end views/index.erb <% @shouts.each do |shout| %> <p>Someone wrote, <q><%=h shout.message %></q></p> <% end %> <form method=post> <textarea name="message"></textarea> <input type=submit value=Shout> </form> 38
    39. 39. Clojure • Lisp dialect on top of Java VM • Programming Clojure, Halloway, PragProg book • John Hume appengine-clj lib – git://github.com/duelinmarkers/appengine-clj.git – users, datastore, test-utils (require '[appengine-clj.datastore :as ds]) (ds/create {:kind "Person" :name "Jimmmy" :age 25}) => {:kind "Person" :key #<Key Person(1138)> :name "Jimmmy" :age 25} • Compojure web framework (inspired by Sinatra) • git://github.com/weavejester/compojure.git • http://elhumidor.blogspot.com/2009/04/clojure-on-google- appengine.html 39
    40. 40. Guestbook in Clojure/Compojure (ns guestbook.servlet ... you no longer need to import UserServiceFactory ... (:require [appengine-clj.users :as users])) (defroutes guestbook-app (GET "/" (let [user-info (request :appengine-clj/user-info) user (user-info :user)] (html [:h1 "Hello, " (if user (.getNickname user) "World") "!"] [:p (link-to (.createLoginURL (user-info :user-service) "/") "sign in")] [:p (link-to (.createLogoutURL (user-info :user-service) "/") "sign out")])))) (defservice (users/wrap-with-user-info guestbook-app)) 40
    41. 41. Tools: Emacs • clojure-mode, slime, swank • Setup tools: – http://riddell.us/tutorial/slime_swank/slime_swank.html • Interactive Programming with Clojure, Compojure, Google App Engine and Emacs – http://www.hackers-with-attitude.com/2009/08/intertactive- programming-with-clojure.html – Edit, C-c C-c, shift-reload • Jeff Foster Wave Robot in Clojure – http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html 41
    42. 42. Wave Robot in Clojure Jeff Foster http://www.fatvat.co.uk/2009/07/google-wave-and-clojure.html (ns uk.co.fatvat.wave.parrot   (:import [com.google.wave.api RobotMessageBundle EventType])   (:gen-class :extends com.google.wave.api.AbstractRobotServlet))                                        (defn- add-blip   [wavelet message]   (.append (.getDocument (.appendBlip wavelet)) message))   (defn -processEvents   [_ bundle]   (let [wavelet (.getWavelet bundle)]     (when (.wasSelfAdded bundle)       (add-blip wavelet "Greetings. I'm alive!"))     (let [participant-changed-events (filter                                        (fn [e] (= (.getType e) (EventType/WAVELET_PARTICIPANTS_CHANGED)))                                        (.getEvents bundle))]       (doseq [event participant-changed-events]         (add-blip wavelet "Hey! It's me!"))))) 42
    43. 43. F
    44. 44. F
    45. 45. http://gaelyk.appspot.com F
    46. 46. http://gaelyk.appspot.com F
    47. 47. Gaelyk Gaelyk is a lightweight Groovy toolkit on top of the Google App Engine Java SDK Gaelyk builds on Groovy’s servlet support Groovlets: Groovy scripts instead of raw servlets! Groovy templates: JSP-like template engine Both allow for a clean separation of views and logic Gaelyk provides several enhancements around the GAE Java SDK to make life easier, thanks to Groovy’s dynamic nature www.devoxx.com
    48. 48. Why Groovy? Groovy is a dynamic language for the JVM very flexible, malleable, expressive and concise syntax easy to learn for Java developers deriving from the Java 5 grammar provides powerful APIs to simplify the life of developers possibility to dynamically enrich existing APIs support for Groovlets and its own template engine We worked with the Google App Engine Java team before the official launch of the platform, to ensure Groovy would www.devoxx.com run well on this new environment
    49. 49. MVC: Groovlets and templates Groovlets Templates (controllers) (views) Entities (domain) www.devoxx.com
    50. 50. First steps... •Go to http://gaelyk.appspot.com •Download the template project •Put your first Groovlet in /WEB-INF/groovy •And your templates at the root •And you’re ready to go! •Launch dev_appserver.sh •Go to http://localhost:8080/
    51. 51. The web.xml "> <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5 <servlet> <servlet-name>GroovletServlet</servlet-name> <servlet-class>groovyx.gaelyk.GaelykServlet</servlet-class> </servlet> <servlet> <servlet-name>TemplateServlet</servlet-name> -class> <servlet-class>groovyx.gaelyk.GaelykTemplateServlet</servlet </servlet> <servlet-mapping> <servlet-name>GroovletServlet</servlet-name> <url-pattern>*.groovy</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>TemplateServlet</servlet-name> <url-pattern>*.gtpl</url-pattern> </servlet-mapping> <welcome-file-list> www.devoxx.com <welcome-file>index.gtpl</welcome-file> </welcome-file-list> </web-app>
    52. 52. A groovlet Instead of writing full-blown servlets, just write Groovy scripts (aka Groovlets) def numbers = [1, 2, 3, 4] def now = new Date() html.html { body { numbers.each { number -> p number } p now } } www.devoxx.com
    53. 53. A template <html> <body> <p><% def message = "Hello World!" print message %> </p> <p><%= message %></p> <p>${message}</p> <ul> <% 3.times { %> <li>${message}</li> <% } %> </ul> </body> www.devoxx.com </html>
    54. 54. Shortcuts Variables available Google services request / response datastore context / applicaiton memcache session urlFetch params mail header userService out / sout / html user Methods available defaultQueue include / forward queues www.devoxx.com print / println xmpp
    55. 55. Groovy sugar!
    56. 56. Sending emails with Gaelyk mail.send to: 'foobar@gmail.com', from: 'other@gmail.com', subject: 'Hello World', htmlBody: '<bold>Hello</bold>' www.devoxx.com
    57. 57. ...compared to Java Properties props = new Properties(); ops, null); Ses sion session = Session.getDefaultInstance(pr String msgBody = "..."; try { Message msg = new MimeMessage(session); m", "Admin"));     msg.se tFrom(new InternetAddress("admin@example.co TO,     msg.addRecipient(Message.RecipientType. "Mr. User"));                      new InternetAddress("user@example.com", n activated");     msg .setSubject("Your Example.com account has bee     msg.setText(msgBody);     Transport.send(msg); } catch (AddressException e) {} } catch (MessagingException e) {} www.devoxx.com
    58. 58. Accessing the datastore Direct interaction with the low-level datastore API ty import com.google.appengine.api.datastore.Enti   Entity entity = new Entity("person")   map // subscript notation, like when accessing a entity['name'] = "Guillaume Laforge"   // normal property access notation entity.age = 32 entity.save() entity.delete() datastore.withTransaction { www.devoxx.com // do stuff with your entities // within the transaction }
    59. 59. Querying to be improved... import com.google.appengine.api.datastore.* der.* import static com.google.appengine.api.datastore.FetchOptions.Buil   // query the scripts stored in the datastore def query = new Query("savedscript")   // sort results by descending order of the creation date query.addSort("dateCreated", Query.SortDirection.DESCENDING)   author // filters the entities so as to return only scripts by a certain r) query.addFilter("author", Query.FilterOperator.EQUAL, params.autho   PreparedQuery preparedQuery = datastore.prepare(query)   // return only the first 10 results def entities = preparedQuery.asList( withLimit(10) ) www.devoxx.com
    60. 60. ...into something groovier? def entities = datastore.createQuery { select from: savedscript sort DESC, on: dateCreated where author == params.author limit 10 } as List www.devoxx.com
    61. 61. ...into something groovier? def entities = datastore.createQuery { select from: savedscript sort DESC, on: dateCreated where author == params.author te d! limit 10 en } as List l p em t Im t Ye N o www.devoxx.com
    62. 62. Task queue API // access a configured queue using the subscript notation queues['dailyEmailQueue']   // or using the property access notation queues.dailyEmailQueue   // you can also access the default queue with: queues.default defaultQueue // add a task to the queue queue << [ countdownMillis: 1000, url: "/task/dailyEmail", taskName: "Send daily email newsletter", method: 'PUT', params: [date: '20090914'], payload: content www.devoxx.com ]
    63. 63. Jabber / XMPP support (1/3) Sending instant messages String recipient = "someone@gmail.com"   // check if the user is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, body: "Hello, how are you?")   // checks the message was successfully // delivered to all the recipients assert status.isSuccessful() } www.devoxx.com
    64. 64. Jabber / XMPP support (2/3) Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { name 'Google' } } })   // checks the message was successfully delivered to the service www.devoxx.com assert status.isSuccessful() }
    65. 65. Jabber / XMPP support (2/3) Sending instant messages with an XML payload String recipient = "service@gmail.com"   // check if the service is online if (xmpp.getPresence(recipient).isAvailable()) { // send the message def status = xmpp.send(to: recipient, xml: { customers { customer(id: 1) { <customers> name 'Google' <customer id=’1’> } <name>Google</name> } </customer> }) </customers>   // checks the message was successfully delivered to the service www.devoxx.com assert status.isSuccessful() }
    66. 66. Jabber / XMPP support (3/3) Receving incoming instant messages Configure the XmppServlet in web.xml Add the inbound message service in appengine-web.xml // get the body of the message message.body // get the sender Jabber ID message.from // get the list of recipients Jabber IDs message.recipients   // if the message is an XML document instead of a raw string message if (message.isXml()) { // get the raw XML www.devoxx.com message.stanza // get a document parsed with XmlSlurper message.xml }
    67. 67. Memcache service Map notation access to the cache } class Country implements Serialzable { String name   def countryFr = new Country(name: 'France')   in the cache // use the subscript notation to put a country object // (you can also use non-string keys) memcache['FR'] = countryFr   // check that a key is present in the cache if ('FR' in memcache) { the cache using a key // use the subscript notation to get an entry from def countryFromCache = memcache['FR'] } www.devoxx.com
    68. 68. What’s coming next? A new Gaelyk 0.3 release a couple days ago Sugar for the Memcache service The incoming email support in GAE SDK 1.2.6 Add more sugar around... The Datastore query system SQL-like DSL, dynamic finders... DSL for the URL Fetch service for accessing REST resources More generally... Anything that’ll come up in upcoming GAE SDK versions www.devoxx.com
    69. 69. DEMO www.devoxx.com
    70. 70. The use case Collaboratively consolidated Twitter search Send a search query to groovydemos@appspot.com The bot will receive your message store the query in the datastore enqueue a task for processing the search The queue handler will parse the Twitter search feed for the query put the results into memcache www.devoxx.com Browse http://groovydemos.appspot.com
    71. 71. www.devoxx.com
    72. 72. www.devoxx.com
    73. 73. www.devoxx.com
    74. 74. spo t.com p mos @ap e gro ovyd www.devoxx.com
    75. 75. spo t.com p mos @ap e gro ovyd www.devoxx.com
    76. 76. spo t.com p mos @ap e gro ovyd www.devoxx.com
    77. 77. spo t.com p mos @ap e gro ovyd www.devoxx.com
    78. 78. spo t.com p mos @ap e gro ovyd www.devoxx.com
    79. 79. spo t.com p mos @ap e gro ovyd www.devoxx.com
    80. 80. spo t.com p mos @ap e gro ovyd www.devoxx.com
    81. 81. spo t.com p mos @ap e gro ovyd www.devoxx.com
    82. 82. spo t.com p mos @ap e gro ovyd pot.com yde mos.apps ://groov www.devoxx.com http
    83. 83. Summary Easy access to a cloud solution Deploying Java apps, as easily as you would with PHP Familiar to Java folks Your good old Servlet centric webapps style Pretty cheap You need a high-trafficed website to reach the quotas Gaelyk provides a simplified approach to creating Servlet centric webapps in a productive manner Leveraging Groovy’s servlet / template support and dynamic capabilities www.devoxx.com
    84. 84. Thanks for your attention! e nezon cy Manager aforg pment a ume L Develo ck Ch Advoca Guilla Groovy Patri Cloud m ad of gmail.c om & Client anezon@go ogle.co He e@ glaforg rge Email: @glafo E mail: ch chanezon @ Twitter : T witter : References: • http://code.google.com/appengine/ • http://gaelyk.appspot.com/ www.devoxx.com • http://groovy.codehaus.org/ • http://grails.org/
    85. 85. Images used in this presentation Clouds http://www.morguefile.com/archive/display/627059 http://www.morguefile.com/archive/display/625552 http://www.morguefile.com/archive/display/629785 Duke ok GAE http://code.google.com/images/duke-on-gae.jpg http://weblogs.java.net/blog/felipegaucho/archive/ae_gwt_java.png Python logo : http://python.org/images/python-logo.gif Gaelyc cross with clouds : http://www.morguefile.com/archive/display/37889 Speed limit : http://www.morguefile.com/archive/display/18492 Warehouse : http://www.morguefile.com/archive/display/85628 Snow foot steps : http://www.flickr.com/photos/robinvanmourik/2875929243/ Sugar : http://www.flickr.com/photos/ayelie/441101223/sizes/l/ www.devoxx.com
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×