我正在尝试运行多个TweetStream客户端并跟踪关键字,每个客户端都有不同的访问/ oauth令牌(在不同的Twitter帐户上创建)。我正在使用sidekiq来启动每个TweetStream::Client
实例。
我希望这是因为我应该能够启动每个sidekiq作业并分别跟踪每个关键字。但是,我发现的是,只要第一个TweetStream::Client
连接并跟踪,那么在该点之后初始化的任何客户端都会被立即处理"又名完成,在sidekiq,不跟踪关键字。
def perform(app_id)
app = App.get(app_id)
client = prepare_twitter_client(app)
stream_tweets("google", app_id, client)
end
def prepare_twitter_client(app)
# Use the companies twitter app token to connect to the stream
@twitter_client = nil
@twitter_client = TweetStream::Client.new
@twitter_client.consumer_key = app.tw_consumer_key
@twitter_client.consumer_secret = app.tw_consumer_secret
@twitter_client.oauth_token = app.tw_oauth_token
@twitter_client.oauth_token_secret = app.tw_oauth_secret
@twitter_client.auth_method = :oauth
return @twitter_client
end
def stream_tweets(company_domain, app_id, twitter_client)
twitter_client.on_error do |message|
end.track(company_domain) do |status|
logger.info "Tweet found that match the criteria. #{status.text}"
create_new_impression(status, app_id)
end
end
我怀疑TweetStream在创建单独的实例和跟踪来自多个客户端的关键字时遇到了问题。
答案 0 :(得分:1)
解决。
TweetStream
似乎不是线程安全的。即使我会为每个sidekiq作业实例重新创建一个新的TwitterStream::Client
,甚至有不同的Twitter帐户/应用程序,我也无法同时运行多个作业。
我将TweetStream
替换为Sferik Twitter Gem并且效果很好。