Created
November 4, 2011 02:42
Initializer that allows EventMachine to run within Rails, and work with AMQP, Passenger, Thin and Capybara
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'amqp' | |
module HiringThingEM | |
def self.start | |
if defined?(PhusionPassenger) | |
PhusionPassenger.on_event(:starting_worker_process) do |forked| | |
# for passenger, we need to avoid orphaned threads | |
if forked && EM.reactor_running? | |
EM.stop | |
end | |
Thread.new { | |
EM.run do | |
AMQP.channel ||= AMQP::Channel.new(AMQP.connect(:host=> Q_SERVER, :user=> Q_USER, :pass => Q_PASS, :vhost => Q_VHOST )) | |
end | |
} | |
die_gracefully_on_signal | |
end | |
else | |
# faciliates debugging | |
Thread.abort_on_exception = true | |
# just spawn a thread and start it up | |
Thread.new { | |
EM.run do | |
AMQP.channel ||= AMQP::Channel.new(AMQP.connect(:host=> Q_SERVER, :user=> Q_USER, :pass => Q_PASS, :vhost => Q_VHOST )) | |
end | |
} unless defined?(Thin) | |
# Thin is built on EventMachine, doesn't need this thread | |
end | |
end | |
def self.die_gracefully_on_signal | |
Signal.trap("INT") { EM.stop } | |
Signal.trap("TERM") { EM.stop } | |
end | |
end | |
HiringThingEM.start |
I think it works similarly to Passenger, but I'm not sure. If you get it working, I would love a contribution to the Momentarily gem (https://github.com/eatenbyagrue/momentarily) which puts the code above into a gem for easily adding to any Rails project.
I'm curious if this has been verified with Passenger+Apache. Under what circumstances does the signal get trapped and handled with the callback specified in the gist? I ask because when I run this from what I can tell, Passenger traps the signal and calls it's own handler, while my handler never executes.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Any idea how this would work with Unicorn ?