Sinatra を使用して Heroku で eventmachine を実行する際の非同期パターンについて理解しようとしています。簡単に言えば、私が達成しようとしているのはこれです: em-httpを使用して Twitter ストリーミング API への http 要求を作成し、ストリームコールバックで、websockets を使用してツイートを解析し、クライアントにプッシュします。ここまでは順調ですね。問題は、同じアプリケーションが Web ページも提供する必要がある場合に発生します。私のconfig.ruには、他のBundlerのものの中でも、
require 'app'
run TwitterApp
次に、アプリ ファイルの EM ブロック:
EM.run{
class TwitterApp < Sinatra::Base {
get '/' do
haml :index
end
}
http = EventMachine::HttpRequest.new(url, options).get :head=>{'Authorization' => [USERNAME, PASSWORD]}
http.stream do |chunk|
#parse tweet, push using websockets
end
}
現在、何が起こっているように見えるかというと、EventMachine が Reactor パターンを使用して返されないため、 run TwitterAppに到達することはありません。
代わりに、私がやろうとすると
App.run!
EM.run ブロック内では、すべてがローカルで正常に実行され、ruby app.rbを使用して実行されますが、ラックアップを使用すると、サーバーが 2 回 (1 回は Thin で、もう 1 回は WEBrick で) 実行されるようで、Heroku では次のようにクラッシュします。
Error R11 (Bad bind) -> Process bound to port other than $PORT
Stopping process with SIGKILL
ここで非常に些細なことを見逃していますか?
どうもありがとう!