public
Description: A wrapper of the Java Whalin MemCache client for JRuby
Homepage:
Clone URL: git://github.com/ikai/jruby-memcache-client.git
name age message
file .gitignore Tue Mar 17 18:34:54 -0700 2009 Adding the NetBeans project files (minus the pr... [Frederic Jean]
file MIT-LICENSE Sun Apr 26 08:53:27 -0700 2009 Removed more stuff, going to make it a drop in ... [abhiyerra]
file README Tue Aug 04 16:40:03 -0700 2009 Updating README to use correct gem location [ikai]
file Rakefile Wed May 06 12:45:49 -0700 2009 Fixing the error message for missing rspec and ... [Frederic Jean]
file VERSION.yml Sun Oct 04 21:57:41 -0700 2009 Forgot version file. [Frederic Jean]
file jruby-memcache-client.gemspec Sun Oct 04 16:55:22 -0700 2009 Bumping the version to 1.6.0. Getting the spec... [Frederic Jean]
directory lib/ Sun Oct 04 22:40:27 -0700 2009 Ok.. So delete does take 2 params after all... [Frederic Jean]
directory spec/ Sun Oct 04 21:44:29 -0700 2009 Modified the servers method so it attaches whet... [Frederic Jean]
README
This projects provides memcached based stores for JRuby. It is a gem based on Ikai Lan's jruby-memcache-client project 
hosted at http://github.com/ikai/jruby-memcache-client/tree

This project is a JRuby wrapper of the Java MemCache library by Greg Whalin

http://www.whalin.com/memcached/

In production, the standard Ruby MemCache client can cause a thread to hang. In the Glassfish application server, by 
default there are 5 Grizzly connectors that handle incoming requests. A site that uses MemCache heavily can quickly 
cause all Grizzly connectors to block and take down a site. I'm hoping that this work I am doing here will help others 
adopt JRuby as a production platform for their Ruby on Rails applications.

The Ruby MemCache library was never written with threaded applications in mind. All threads use the same socket, and 
multithreaded mode basically wraps the IO with a Mutex. The Java library provides several features that are not 
available in the Ruby MemCache library:

- connection pooling
- socket timeouts. In forks of the Ruby MemCache library this is achieved either with a Mongrel timeout or use of the 
Ruby Timeout class, which, at least at the writing of this README, will work unpredictably when being used as a failsafe 
against hanging IO.

As of right now this code only provides a very minimal amount of functionality, but it is enough to use with the Rails 
cache and cache_fu.

Installation
------------
This is a ruby gem that can be installed.

gem sources -a http://gems.github.com
gem install ikai-jruby-memcache-client --remote

Replacing Rail's MemCache Client
--------------------------------

Rails ships with a bundled copy of the MemCache client. This client will prevent you from using this gem instead. Adding 
the following code into your environment.rb file:

if RUBY_PLATFORM =~ /java/i
  # Based on instructions from http://www.mikeperham.com/2009/03/03/using-memcache-client-16x-in-rails-23/
  # Brain surgery to use our own version of memcache-client without
  # having to modify activesupport directly.
  # Unload any previous instance of the class
  if Object.const_defined? :MemCache
    Object.instance_eval { remove_const :MemCache }
  end
  # Pull in the exact version we want
  gem 'ikai-jruby-memcache-client', '1.5.0'

  # Ensure that the memcache-client path is at the front of the loadpath
  $LOAD_PATH.each do |path|
    if path =~ /ikai-jruby-memcache-client/
      $LOAD_PATH.delete(path)
      $LOAD_PATH.unshift(path)
    end
  end
  # If Ruby thinks it's already loaded memcache.rb, force
  # a reload otherwise just require.
  if $".find { |file| file =~ /\Amemcache.rb\Z/ }
    load 'memcache.rb'
  else
    require 'memcache'
  end
end

This will remove the original MemCache client and load our version of the MemCache class instead.

Configuration
-------------
The JRuby MemCache client uses the same configuration options as the regular MemCache client. Here is how to build the 
configuration in your environment.rb file:

memcache_options = {
  :namespace => 'fortaleza:production_live:',
}
memcached_servers = [ ENV['MEMCACHED_LOCATION'] || '0.0.0.0:11211']

# Constant used by libs
CACHE = MemCache.new memcached_servers, memcache_options if RUBY_PLATFORM =~ /java/

Note that this may vary based on your particular configuration method and environment.