我在rails应用程序上有一个ruby,它每小时执行一次rake tweet
,从数据库发送一条推文。在看了我发现的日志之后,我注意到有几次推文没有发送:
2013-02-11T19:00:39+00:00 app[scheduler.8796]: Connecting to database specified by DATABASE_URL
2013-02-11T19:00:39+00:00 app[scheduler.8796]: (__-){ Twitter is over capacity.
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/response/raise_error.rb:21:in `on_complete'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:9:in `block in call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: rake aborted!
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:63:in `on_complete'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/request/multipart.rb:13:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/response.rb:8:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/connection.rb:110:in `post'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/request/multipart_with_file.rb:14:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/connection.rb:245:in `run_request'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/faraday-0.8.5/lib/faraday/request/url_encoded.rb:14:in `call'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/lib/tasks/scheduler.rake:11:in `block in <top (required)>'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/api/tweets.rb:129:in `update'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter.rb:52:in `method_missing'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/api/utils.rb:82:in `object_from_response'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/client.rb:81:in `request'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: /app/vendor/bundle/ruby/1.9.1/gems/twitter-4.5.0/lib/twitter/client.rb:70:in `post'
2013-02-11T19:00:39+00:00 app[scheduler.8796]: (See full trace by running task with --trace)
2013-02-11T19:00:39+00:00 app[scheduler.8796]: Tasks: TOP => tweet
2013-02-11T19:00:41+00:00 heroku[scheduler.8796]: Process exited with status 1
如何才能捕获此特定错误并重新发送推文直至发送?
在我的rake文件中:
task :tweet => :environment do
if ApprovedTweet.all.size > 0
t = ApprovedTweet.first
Twitter.update(t.text)
t.destroy
end
答案 0 :(得分:1)
据Twitter gem's documentation所知,Twitter::Error::TooManyRequests
似乎是你想要捕捉的错误。
如果我是你,我不会重新发送推文直到它被发送(特别是在rake任务中 - 你很容易最终得到一个僵尸进程)但反过来会允许在失败之前进行多次重试:
begin
Twitter.update(t.text)
rescue Twitter::Error::TooManyRequests => e
retries ||= 0
retries += 1
if retries < ARBITRARY_MAX_RETRY_LIMIT
# optionally sleep or delay for a while
# ... or just log failure
retry
else
raise e # or another custom error of yours
end
end