An Evented Beanstalk Client
Switch branches/tags
Nothing to show
Latest commit 9e9cc04 Jul 27, 2012 @dj2 dj2 Cleanup README.
Deleting the maintainer bit I'd added to the top of the Readme file.
Failed to load latest commit information.
spec Handle various connection failures Jun 27, 2012
COPYING add rakefile, gemspec and copying files Mar 9, 2009
README.rdoc Cleanup README. Jul 27, 2012
Rakefile Update Rakefile for use with Bundler May 23, 2011
em-jack.gemspec s.require_path takes a single argument, not an array. Feb 10, 2012



An attempt to wrap portions of the Beanstalk protocol with EventMachine. Every command will return a deferrable object. That object will succeed or fail depending on the reply returned from Beanstalk.

One thing to keep in mind. The Beanstalk protocol executes all commands serially. So, if you send a reserve command and there are no jobs Beanstalk _won't_ process any of the commands that come after the reserve until the reserve completes.

This is a bit of a gotcha when sending a series of reserve, delete, etc and there are no available jobs.


- EventMachine
- RSpec  (to run the tests)

Examples {
  jack =

  r = jack.use('mytube')
  r.callback { |tube| puts "Using #{tube}" }

  r = jack.reserve
  r.callback do |job|
    puts job.jobid

    r2 = jack.delete(job) { puts "Successfully deleted" }

  r = jack.put("my message", :ttr => 300) { |jobid| puts "put successful #{jobid}" }

  r = jack.stats
  r.callback { |stats| puts "Server up for #{stats['uptime']} seconds" }

  r = jack.stats(:tube, "mytube")
  r.callback { |stats| puts "Total jobs #{stats['total-jobs']}" }

  r = jack.list(:used)
  r.callback { |tubes| puts "There are #{tubes.length} tubes defined" }

Each of the Jack commands allows an optional block to be provided. If the block is given
it will be setup as the callback on the deferrable.

EMJack#each_job is useful for scenarios where the client is a job worker
and intended to process jobs continuously as they become available. Once
the queue is empty, the client will block and wait for a new job.

If multiple workers connect to the queue Beanstalkd will round-robin between
the workers. {
    jack =

    jack.each_job do |job|
      puts "Got job ##{job.jobid}: #{job}"

      if process(job)
        r = jack.delete(job)
        r.callback { puts "*Deleted #{job}*" }

    def process(job)
      # Some kind of job processing


If you've got any questions, comments or bugs, please let me know. You can contact me by email at dj2 at everburning dot com.


Charles Melbye (cmelbye) Peter Kieltyka (pkieltyka) Martyn Loughran (mloughran) Mike Perham (mperham)