使用带有Rails EventMachine和Thin的async_sinatra时,“uncaught throw:async”

时间:2011-11-30 13:28:17

标签: ruby-on-rails sinatra eventmachine thin

我正在尝试设置我的环境,让两个rails,EventMachine和async_sinatra一起玩,我想我有一些设置错误因为我收到错误“uncaught throw:async”。

这是我在Gemfile中的内容:

source 'http://rubygems.org'

gem 'rails', '3.1.3'
gem 'sinatra'
gem 'async_sinatra'
gem 'execjs'
gem 'therubyracer'
gem 'eventmachine'
gem 'rack-fiber_pool',  :require => 'rack/fiber_pool'
gem 'thin'

这是config.ru:

require ::File.expand_path('../config/environment',  __FILE__)
use Rack::FiberPool
run Longpoll::Application

这就是我在routes.rb文件中的内容:

match '/longpoll', :to => LongPoll

这是我的long_poll.rb文件:

class LongPoll < Sinatra::Base
  register Sinatra::Async

  aget '/longpoll' do
    body 'Hello world!'
  end
end

任何想法我都缺少这个设置吗?

修改

我发现没有rack-fiber_pool的工作可以解决问题。 任何人都可以确认他们是否可以一起工作吗?

另一个给出相同错误basic.ru的例子:

#!/usr/bin/env rackup -Ilib:../lib -s thin
require 'sinatra/async'
require 'rack/fiber_pool'

class AsyncTest < Sinatra::Base
  register Sinatra::Async
  use Rack::FiberPool

  enable :show_exceptions

  aget '/' do
    body "hello async"
  end
end

run AsyncTest.new

2 个答案:

答案 0 :(得分:2)

如果在使用webrick时看到此错误,请切换到thin解决它。 因此我无法直接确认您的假设,但我想使用webrick以及rack-fiber_pool可能会破坏。

#!/usr/bin/env ruby
#
require "rubygems"
require "sinatra/async"

class AsyncTest < Sinatra::Base
  set :server, :thin

  register Sinatra::Async

  aget '/' do
    body "hello async"
  end

  run! if app_file == $0
end

上面的代码对我来说很好。

答案 1 :(得分:0)

IMO他们互相排斥。

rack-fiber-pool负责使用光纤的结果调用async.callback。它还负责执行throw :async告诉瘦以保持连接打开。 async_sinatra也会处理完全相同的事情。当您致电async.callback时,它会致电body {}。并且throw :async认为它必须告诉瘦以保持连接打开。这是你看到的问题。 async_sinatra抛出:async和rack-fiber-pool正在抓住它并认为这是一个实际的错误。

你可以在这里看看async_sinatra:https://github.com/raggi/async_sinatra/blob/master/lib/sinatra/async.rb#L69

和rack-fiber-pool赶上这里:https://github.com/mperham/rack-fiber_pool/blob/master/lib/rack/fiber_pool.rb#L24

如果你想要两者兼顾,你也可以查看sinatra_synchrony。