Камень Eventmachine -> блок в spawn_threadpool - PullRequest
0 голосов
/ 25 марта 2012

Следовал этому руководству (http://arfon.org/twitter-streaming-with-eventmachine-and-dynamodb) в попытке раскрутить среду прослушивания Amazon; получает определенные твиты и добавляет их в базу данных Dynamo (через новый поток). Однако все работает нормально при использовании eventmachine для порождения потоковЯ получаю следующее:

require 'aws-sdk'
require 'eventmachine'
require 'tweetstream'

AWS_ACCESS_KEY = 'HERE IT IS'
AWS_SECRET_KEY = 'YES HERE'


dynamo_db = AWS::DynamoDB.new(:access_key_id => AWS_ACCESS_KEY, :secret_access_key => AWS_SECRET_KEY)

table = dynamo_db.tables['tweets']
table.load_schema

TweetStream.configure do |config|
  config.username = 'geezlouis'
  config.password = 'password'
  config.auth_method = :basic
end

EM.run{
  client = TweetStream::Client.new

  def write_to_dynamo(status)
    EM.defer do
      tweet_hash = {:user_id => status.user.id, 
                    :created_at => status.created_at,
                    :id => status.id,
                    :screen_name => status.user.screen_name}

      begin
        table.items.create(tweet_hash)
      rescue Exception => e  
        puts e.message  
        puts e.backtrace.inspect
      end
    end
  end

  client.track("Romney", "Gingrich") do |status|
    write_to_dynamo(status)
  end  
}  

неопределенная локальная переменная или метод `table 'для main: Object

["tweets.rb:31:in `block in write_to_dynamo'", "/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in

call'", "/.rvm/gems/ruby-1.9.3-p125/gems/eventmachine-0.12.10/lib/eventmachine.rb:1060:in block in spawn_threadpool'"]

1 Ответ

0 голосов
/ 28 марта 2012
Таблица

является локальной переменной, поэтому вы не сможете получить ее из области действия метода.

Вы хотите следующее:

require 'aws-sdk'
require 'eventmachine'
require 'tweetstream'

AWS_ACCESS_KEY = 'HERE IT IS'
AWS_SECRET_KEY = 'YES HERE'


dynamo_db = AWS::DynamoDB.new(:access_key_id => AWS_ACCESS_KEY, :secret_access_key => AWS_SECRET_KEY)

table = dynamo_db.tables['tweets']
table.load_schema

TweetStream.configure do |config|
  config.username = 'geezlouis'
  config.password = 'password'
  config.auth_method = :basic
end

EM.run{
  client = TweetStream::Client.new

  def write_to_dynamo(status, table)
    EM.defer do
      tweet_hash = {:user_id => status.user.id, 
                    :created_at => status.created_at,
                    :id => status.id,
                    :screen_name => status.user.screen_name}

      begin
        table.items.create(tweet_hash)
      rescue Exception => e  
        puts e.message  
        puts e.backtrace.inspect
      end
    end
  end

  client.track("Romney", "Gingrich") do |status|
    write_to_dynamo(status, table)
  end  
}

Вы также, вероятно, захотите прекратить перехватывать «Exception» и вместо этого перехватывать «StandardError», иначе вы не сможете, например, нажать CTRL + C программу.

...