RubyでWEBrickを使い倒す! (Part 2 : サーブレット入門)

WEBrickなるWebサーバがRubyには標準で付いているらしい。

どこまで使い物になるのか、実験してみよう。

 

今回は、サーブレットを動かしてみよう! サンプルコードを下記のように改造した。


#! ruby -Ku print "Ruby #{RUBY_VERSION} using.\n\n" require 'webrick' class HogeServlet < WEBrick::HTTPServlet::AbstractServlet def do_GET(req, res) res['Content-Type'] = "text/plain" body = "---------------------------------------\n" body += "Servlet Object Id = #{self.object_id}\n" body += "Servlet Class name = #{self.class.name}\n" body += "Servlet Method name = #{__method__}\n" body += "---------------------------------------\n" Thread.list.each do |t| body += "Threads = #{t}\n" end body += "---------------------------------------\n" req.header.each do |key, val| body += "#{key} = #{val}\n" end body += "---------------------------------------\n" res.body = body end end srv = WEBrick::HTTPServer.new({ :DocumentRoot => './', :BindAddress => '127.0.0.1', :Port => 20080}) srv.mount('/test', HogeServlet) trap("INT"){ srv.shutdown } srv.start print "ended.\n"

 

Webブラウザ(Firefox)から、http://127.0.01:2080/test にアクセスすると、以下のようなHTTPレスポンスが返ってきた。

Object Idは、リクエストを送る度に変化したため、リクエストを受ける毎にサーブレットインスタンスを生成していると思われる。

スレッド数は、下記に表示されている通り、3つのままであった。何度リクエストしても3つのままだった。ただ、しばらく放置してから再度リクエストを送信すると、スレッドIDが変化した(が、やはり3つのままだった)。よって、時間が経過し、ブラウザが無通信時間が一定時間に達したためにTCPコネクションを切断した際に、Webサーバ側でもTCPコネクション断を検知し、スレッドを消滅させるものと推測。


--------------------------------------- Servlet Object Id = 47207180 Servlet Class name = HogeServlet Servlet Method name = do_GET --------------------------------------- Threads = #<Thread:0x0000000002a0c970 sleep> Threads = #<Thread:0x0000000005a8d090@f:/Ruby26-x64/lib/ruby/2.6.0/webrick/utils.rb:163 run> Threads = #<Thread:0x00000000059f3e90@f:/Ruby26-x64/lib/ruby/2.6.0/webrick/server.rb:286 run> --------------------------------------- host = ["127.0.0.1:20080"] user-agent = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:65.0) Gecko/20100101 Firefox/65.0"] accept = ["text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"] accept-language = ["ja,en-US;q=0.7,en;q=0.3"] accept-encoding = ["gzip, deflate"] dnt = ["1"] connection = ["keep-alive"] upgrade-insecure-requests = ["1"] cache-control = ["max-age=0"] ---------------------------------------

 

Firefoxでリクエストを送信した直後に、別のWebブラウザ(Internet Explorer)からリクエストしてみた。期待通り、スレッドは3つから4つに増えた。


--------------------------------------- Servlet Object Id = 47119260 Servlet Class name = HogeServlet Servlet Method name = do_GET --------------------------------------- Threads = #<Thread:0x0000000002a0c970 sleep> Threads = #<Thread:0x0000000005a8d090@f:/Ruby26-x64/lib/ruby/2.6.0/webrick/utils.rb:163 run> Threads = #<Thread:0x00000000059c2e30@f:/Ruby26-x64/lib/ruby/2.6.0/webrick/server.rb:286 sleep> Threads = #<Thread:0x00000000059c2bd8@f:/Ruby26-x64/lib/ruby/2.6.0/webrick/server.rb:286 run> --------------------------------------- accept = ["text/html, application/xhtml+xml, image/jxr, */*"] accept-language = ["ja-JP"] user-agent = ["Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"] accept-encoding = ["gzip, deflate"] host = ["127.0.0.1:20080"] connection = ["Keep-Alive"] ---------------------------------------

 

 ブラウザを閉じると、Webサーバのスレッド数も1つ減る。

まとめると、WEBrickは、

ようである。

あと気になるのは、複数リクエストにまたがったセッションを実現するため、JavaServletでいうところの setAttributeメソッド的な概念がWEBrickにも用意されているのかどうかだが、また今度調査することにする。

 

 

 ---------------------------------------
ITとことんのトップページ
  ┗━ ■Rubyのトップページ
            ┗━ ■本ページ