こんにちは。Ruby初心者のkuroです。
現在、WindowsPC上に Ruby on Rails の環境を作って開発をしていますが、この数日、ピタッと進捗が停止しています。
原因は、Rubyに標準で同梱されている(開発用サーバーとしておなじみの)WEBrickにありそうなのですが、一向に解決策が見つからず困り果てています。
あまりに初歩的な疑問なので、なかなか諸先輩にも質問しずらく、まずは状況整理の意味でここに書いてみたというわけです。
<状況説明>
・次のような2つのプログラム(いずれもRuby)があります。
・1つは、ごく簡単なREST(GETメソッドを使ってアクセスするとXMLを返す)型のWebサービス。
・もう1つは、そのWebサービスを呼び出すクライアントページです。
・前者を「SP」、後者を「CP」と呼ぶことにします。
<現象>
・WEBrickを既定のポート番号で起動( http://localhost:3000/ )する。
・ブラウザでCPにアクセス( http://localhost:3000/CP/ )する。これは正常に動作している。
・CPの画面操作によって、Ajax通信(SPへのGETリクエスト)を実行する。
・ここでダンマリとなり、1分くらいでタイムアウト。
<考察1>
・試しに、ブラウザのアドレス欄に直接、SPのURIを入力してアクセスすると正常にレスポンス(XML)が帰ってきます。
<考察2>
・試しに、SPとCPを別々のサーバー(異なるポート番号で起動したWEBrick上)で動かすと、ちゃんと動くのです。
・CPからのリクエスト通り、SPからのレスポンスが瞬時に返ってきます。
<考察3>
・試しに、友人のヨッシーが借りているレンタルサーバー(Apache)でテストしたところ、SPとCPが同居していても正常に動作しました。
<まとめ>
・以上のことから、この現象はクライアントページとサーバーページが同一WEBrickサーバー上で動作する場合に起こるのではないかと推察されます。
何か解決策はあるのでしょうか?
それとも、そもそも、このような設計(SPとCPの同居)が望ましくないということはあるでしょうか?
どなたか、迷える子羊をお助けください。
(なんてここに書いて、はたして反応があるのだろうか・・・)
コメント (6)
あまり関係ないかもしれませんが、localhostではなく、127.0.0.1にしてみてもらえますか?
同一ホストで通信するのは普通です。
なので、方法的にはあってると思います。
師匠、じきじきのご登場ありがとうございます。
さっそく試しましたが改善されませんねぇ・・・
はじめまして。
システムの構成としては、とくに問題ないと思います。
あとはどのようにコーディングしているかですが……。
とりあえずサンプルプログラムを作ってみたので
試してみてください。
http://www.geocities.jp/aike1000/webrick.zip
CPがlocalhost:3000で動いているのはわかりましたが、SPはどこで動いているのでしょうか?
もしSPもlocalhost:3000でしたら、デッドロックするので動かなくて当たり前な気がしますが。
tmaedaさんが書かれているとおり、同じwebrick上で動かしているために、デットロックになっている線が濃厚ですねぃ。
そうなんですか! サーバーがマルチスレッドでないためデッドロックが起こるんですね。
説明が不十分でしたが、「ブラウザ上のWebページ」→リクエスト→「サーバ・ページA」→リクエスト→「サーバ・ページB」という具合にリクエストをリレーしているので、サーバ・ページAの実行中にサーバ・ページBを起動しようとしてデッドロックに陥るわけですね。
納得です。アプリ構成を見直してみます。皆さん、ありがとうございました!