OSDN Git Service

ActiveLdap 1.2.4
[redminele/redminele.git] / ruby / lib / ruby / gems / 1.8 / gems / mongrel-1.1.5-x86-mswin32-60 / examples / mongrel_simple_service.rb
1 # This script emualtes script/server behavior but running webrick http server \r
2 require 'rubygems'\r
3 \r
4 require 'mongrel'\r
5 require 'yaml'\r
6 require 'zlib'\r
7 \r
8 require 'win32/service'\r
9 \r
10 DEBUG_LOG_FILE = File.expand_path(File.dirname(__FILE__) + '/debug.log') \r
11 \r
12 class SimpleHandler < Mongrel::HttpHandler\r
13     def process(request, response)\r
14       response.start do |head,out|\r
15         head["Content-Type"] = "text/html"\r
16         results = "<html><body>Your request:<br /><pre>#{request.params.to_yaml}</pre><a href=\"/files\">View the files.</a></body></html>"\r
17         if request.params["HTTP_ACCEPT_ENCODING"] == "gzip,deflate"\r
18           head["Content-Encoding"] = "deflate"\r
19           # send it back deflated\r
20           out << Zlib::Deflate.deflate(results)\r
21         else\r
22           # no gzip supported, send it back normal\r
23           out << results\r
24         end\r
25       end\r
26     end\r
27 end\r
28 \r
29 class MongrelDaemon < Win32::Daemon\r
30   def initialize(options)\r
31     @options = options\r
32   end\r
33   \r
34   def service_init\r
35     File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init entered") }\r
36 \r
37     File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("Mongrel running on #{@options[:ip]}:#{@options[:port]} with docroot #{@options[:server_root]}") } \r
38 \r
39     @simple = SimpleHandler.new\r
40     @files = Mongrel::DirHandler.new(@options[:server_root])\r
41 \r
42     @http_server = Mongrel::HttpServer.new(@options[:ip], @options[:port])\r
43     @http_server.register("/", @simple)\r
44     @http_server.register("/files", @files)\r
45 \r
46     File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_init left") }\r
47   end\r
48   \r
49   def service_stop\r
50     File.open(DEBUG_LOG_FILE,"a+"){ |f|\r
51       f.puts "stop signal received: " + Time.now.to_s\r
52       f.puts "sending stop to mongrel threads: " + Time.now.to_s\r
53     }\r
54     #@http_server.stop\r
55   end\r
56 \r
57   def service_pause\r
58     File.open(DEBUG_LOG_FILE,"a+"){ |f|\r
59       f.puts "pause signal received: " + Time.now.to_s\r
60     }\r
61   end\r
62   \r
63   def service_resume\r
64     File.open(DEBUG_LOG_FILE,"a+"){ |f|\r
65       f.puts "continue/resume signal received: " + Time.now.to_s\r
66     }\r
67   end\r
68 \r
69   def service_main\r
70     File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main entered") }\r
71     \r
72     begin\r
73       File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - http_server.run") }\r
74       @http_server.run\r
75     \r
76       # No runner thread was needed after all!\r
77       #@runner = Thread.new do\r
78       #  @http_server.acceptor.join\r
79       #end\r
80       #File.open("d:\\test.log","a+") { |f| f.puts("#{Time.now} - runner.run") }\r
81       #@runner.run\r
82       \r
83       # here is where magic happens!\r
84       # if put blocking code here, the thread never left service_main, and the rb_func_call in service.c\r
85       # never exit, even if the stop signal is received.\r
86       #\r
87       # to probe my theory, just comment the while loop and remove the '1' from sleep function\r
88       # service start ok, but fail to stop.\r
89       #\r
90       # Even if no functional code is in service_main (because we have other working threads),\r
91       # we must monitor the state of the service to exit when the STOP event is received.\r
92       #\r
93       # Note: maybe not loop in 1 second intervals?\r
94       while state == RUNNING\r
95         sleep 1\r
96       end\r
97       \r
98     rescue StandardError, Exception, interrupt  => err\r
99       File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("#{Time.now} - Error: #{err}") }\r
100       File.open(DEBUG_LOG_FILE,"a+"){ |f| f.puts("BACKTRACE: " + err.backtrace.join("\n")) }\r
101       \r
102     end\r
103     \r
104     File.open(DEBUG_LOG_FILE,"a+") { |f| f.puts("#{Time.now} - service_main left") }\r
105   end\r
106   \r
107 end\r
108 \r
109 OPTIONS = {\r
110   :port            => 3000,\r
111   :ip              => "0.0.0.0",\r
112   :server_root     => File.expand_path(File.dirname(__FILE__)),\r
113 }\r
114 \r
115 web_server = MongrelDaemon.new(OPTIONS)\r
116 web_server.mainloop\r