oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

【スクリプトメモ】rubyで別スレッドが更新している情報を返すWebサーバを作ったよ。

自分用メモでタイトルまんまです。
概要として

  1. あるスレッドは一定間隔でとあるサーバの情報を取得し、その情報を内部で保存する動作を繰り返す。
  2. その情報をクライアント側がアクセス出来るようにWebサーバとして動作させる。


ぶっちゃけWebサーバ部分のソースは
http://jampin.blog20.fc2.com/blog-entry-112.html
さんの情報まんまです・・・。

スレッド部分は以前書いた
スクリプトメモ:rubyでデーモン作ったよ。
http://www.namaraii.com/rubytips/?%A5%B9%A5%EC%A5%C3%A5%C9
を参照してスレッド化しました。


で、実際の内容は

#!/opt/ruby-1.9.2/bin/ruby

require 'rubygems'
require 'net/http'
require 'webrick'

class FileGet
    data_get = Thread.new do
        http = Net::HTTP.new("example.com", 80)
        req = Net::HTTP::Get.new('/hogehoge.txt')

        while true
           res = http.request(req)
           $body = res.body
           sleep(0.5)
        end
    end
end

class Test < WEBrick::HTTPServlet::AbstractServlet
    def do_GET(req, resp)
        resp.body = $body
        raise WEBrick::HTTPStatus::OK
    end

    def do_POST(req, resp)
        resp.body = "ServletA receive Post request with params (name => #{req.query['name']})"
        raise WEBrick::HTTPStatus::OK
    end
end

Response = WEBrick::HTTPServer.new(
    :Port => 10080,
    :DocumentRoot   => '~/public_html/'
)
Response.mount('/test', Test)
trap("INT"){RateResponse.shutdown}

RateResponse.start

という感じに。面倒くさかったのでスレッドが取得している情報は、プークスクスのグローバル変数叩き込みです。
これをtest.rbみたいな適当な名前付けて

ruby test.rb

で実行すれば動くはず。