Wednesday, August 5, 2009

JRuby + Merb + Google AppEngine MemCache

Searching far and wide for a cheap Java based web hosting provider, I became interested in learning about Google's AppEngine, which offers free space for web applications within reasonable access limits. I also thought that this would be a good opportunity to learn some Ruby (JRuby) to write a web application. In short, this post is about how to configure MERB running on JRuby/Google AppEngine to use Google's MemCache store to store session data via memcache instead of cookies.

I wanted to do this because I didn't want my web application data stored in a browser's cookie and so either I could use MemCache or the DataStore and I chose memcache. I assume that you have an AppEngine project setup with MERB as your web framework of choice.

All the changes described are located in /war/WEB-INF/config/init.rb
  1. Load the APIs (place these near the top of init.rb)
    # Load the apis
    ENV['APPLICATION_ROOT'] = File.join(File.dirname(__FILE__), '..')
    require 'appengine-apis/local_boot'
  2. Change the session store from cookie to memcache
    c[:session_store] = 'memcache'
  3. Add the following to the Merb::BootLoader.after_app_loads section # This will get executed after your app's classes have been loaded.
    Merb::MemcacheSession.store = AppEngine::Memcache.new
    module AppEngine
    # For the memcache-client gem.
    class Memcache
    include Merb::MemcacheStore
    end
    end
The first two and a good portion of the third step are standard Merb as far as I understand (although it took me some digging through the Merb code to find this). The second part of the third step is what I discovered when looking at the source code to see how the standard Memcache gem is integrated into the memcache store. Once I added this mixin AppEngine module, I had session data stored in memcache! Post comments if this works or doesn't work for you and/or if you have any other suggestions, please post so that others can find it!

No comments:

Post a Comment