前々回、前回に引き続き、もうちょっとResqueの練習。試しに、このブログの更新情報をTwitterに流す仕組を作ってみた。twitterfeed的なことをする感じで、ブログに投稿したら、Twitterにリンクをポスト、またN時間後にポスト、という感じで。うざそうなので実際には使わないかも。
追記: resque-schdulerのcron的な使い方について別のエントリで書いた。
このN時間後に投稿の部分にresque-schedulerを使ってみた。
Twitterへ投稿するライブラリは、grackleを使ってみた。特に深い理由はない。単純にポストするだけだから何でもいいかな、という感じで、簡単そうに使えそうなのを選んだ。
とりあえずインストール。
gem install grackle
gem install resque
gem install resque-scheduler
Twitterにポストするためのクラスを作成する。このクラスは、 performメソッドを実装する。その中でtwitterに投稿するコードを書く。performの引数としてPostしたい文字列を渡すことにする。
class MyTwitter
@queue = :normal
def self.perform(status)
options = Sinatra::Application.options
client = Grackle::Client.new(:auth=>
{:type=>:basic,
:username=>options.twitter_username,
:password=>options.twitter_password})
client.statuses.update! :status=>status
end
end
Rakefileにschedulerのタスクを追加:
require 'resque/tasks'
require 'resque_scheduler/tasks'
これで、準備完了。
scheulderを起動する。
rake resque:scheduler
後はTwitterに投稿したいところで、
# すぐに投稿したい場合 (resque標準)
Resque.enqueue(MyTwitter, "post post post")
# 10時間後に (resuque-scheduler)
Resque.enqueue_in(10.hours, MyTwitter, "post post post")
# 投稿したい日付が決まっている (resuque-scheduler)
Resque.enqueue_at(Time.local(2010, 1, 31, 10, 30), MyTwitter, "post post post")
と言った感じ。とても簡単。
正確には、実行される時間ではなくて、Queueに入る時間なので実際には少し後に実行される。