diff options
author | zedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-02-20 19:08:52 +0000 |
---|---|---|
committer | zedshaw <zedshaw@19e92222-5c0b-0410-8929-a290d50e31e9> | 2006-02-20 19:08:52 +0000 |
commit | 149a58722a5e2fc856e7efe5f89efa4a6e052248 (patch) | |
tree | ff3e923a7129f981e752851b08f9ff9a5dae86f6 /examples/mongrel_simple_service.rb | |
parent | eba148cef471ce85d5986246e3e6c5b2ae4a467a (diff) | |
download | unicorn-149a58722a5e2fc856e7efe5f89efa4a6e052248.tar.gz |
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@51 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'examples/mongrel_simple_service.rb')
-rw-r--r-- | examples/mongrel_simple_service.rb | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/examples/mongrel_simple_service.rb b/examples/mongrel_simple_service.rb new file mode 100644 index 0000000..f8a2f06 --- /dev/null +++ b/examples/mongrel_simple_service.rb @@ -0,0 +1 @@ +# This script emualtes script/server behavior but running webrick http server
require 'rubygems'
require 'mongrel'
require 'yaml'
require 'zlib'
require 'win32/service'
class SimpleHandler < Mongrel::HttpHandler
def process(request, response)
response.start do |head,out|
head["Content-Type"] = "text/html"
results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"
if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"
head["Content-Encoding"] = "deflate"
# send it back deflated
out << Zlib::Deflate.deflate(results)
else
# no gzip supported, send it back normal
out << results
end
end
end
end
class MongrelThread < Thread
def initialize(mongrel_server)
@server = mongrel_server
end
def run
@server.acceptor.join
end
end
class MongrelDaemon < Win32::Daemon
attr_reader :http_server
def initialize(options)
@options = options
end
def service_init
File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - service_init entered") }
File.open("d:\\test.log","a+") { |f| f.puts("Mongrel running on #{@options[:ip]}:#{@options[:port]} with docroot #{@options[:server_root]}") }
@simple = SimpleHandler.new
@files = Mongrel::DirHandler.new(@options[:server_root])
@http_server = Mongrel::HttpServer.new(@options[:ip], @options[:port])
@http_server.register("/", @simple)
@http_server.register("/files", @files)
File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - service_init left") }
end
def service_stop
File.open("d:\\test.log","a+"){ |f|
f.puts "stop signal received: " + Time.now.to_s
}
end
def service_pause
File.open("d:\\test.log","a+"){ |f|
f.puts "pause signal received: " + Time.now.to_s
}
end
def service_resume
File.open("d:\\test.log","a+"){ |f|
f.puts "continue/resume signal received: " + Time.now.to_s
}
end
def service_main
File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - service_main entered") }
begin
File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - http_server.run") }
@http_server.run
# No runner thread was needed after all!
#@runner = Thread.new do
# @http_server.acceptor.join
#end
#File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - runner.run") }
#@runner.run
# here is where magic happens!
# if put blocking code here, the thread never left service_main, and the rb_func_call in service.c
# never exit, even if the stop signal is received.
#
# to probe my theory, just comment the while loop and remove the '1' from sleep function
# service start ok, but fail to stop.
#
# Even if no functional code is in service_main (because we have other working threads),
# we must monitor the state of the service to exit when the STOP event is received.
#
# Note: maybe not loop in 1 second intervals?
while state == RUNNING
sleep 1
end
rescue StandardError, Exception, interrupt => err
File.open("d:\\test.log","a+"){ |f| f.puts("#{Time.now} - Error: #{err}") }
File.open("d:\\test.log","a+"){ |f| f.puts("BACKTRACE: " + err.backtrace.join("\n")) }
end
File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - service_main left") }
end
end
OPTIONS = {
:port => 3000,
:ip => "0.0.0.0",
:server_root => File.expand_path(File.dirname(__FILE__)),
}
web_server = MongrelDaemon.new(OPTIONS)
web_server.mainloop
\ No newline at end of file |