2016-10-25 1 views
1

J'ai construit une application de petits rails et j'ai un script ruby ​​que je voudrais exécuter en arrière-plan de mon application. Actuellement, ce code est placé dans mon répertoire lib (lib/tweetstreamer.rb). Quel est le moyen le plus simple d'accomplir cette tâche tout en continuant à exécuter le code en arrière-plan? Aurais-je besoin d'utiliser un type de commande dans mon contrôleur d'application? J'ai trouvé que lorsque j'utilise "rails runner path/to/tweetstreamer.rb" mon script fonctionne parfaitement.Rails 5 applications exécutant des tâches en arrière-plan

tweetstreamer.rb peut être vu ci-dessous

require 'tweetstream' 
require 'twitter' 
require 'mixpanel-ruby' 

    TweetStream.configure do |conf| 
    conf.consumer_key = "XXXXXXX" 
    conf.consumer_secret = "XXXXXXX" 
    conf.oauth_token = "XXXXXXX" 
    conf.oauth_token_secret = "XXXXXXX" 
    conf.auth_method = :oauth 
    end 

    @store_account = Twitter::REST::Client.new do |config| 
    config.consumer_key = "XXXXXXX" 
    config.consumer_secret = "XXXXXXX" 
    config.access_token = "XXXXXXX" 
    config.access_token_secret = "XXXXXXX" 
    end 

    client = TweetStream::Client.new 

    client.track('mysampletweet') do |status| 

    msg = status.text 
    tag = "#mysampletweet" 

    puts msg 
    puts tag 

    if msg.include? tag 
    message = "@#{status.user.screen_name} Happy Holidays from @myaccountname!" 
    sleep 5 
    @store_account.update(message, in_reply_to_status_id: status.id) 
    end 

    @tracker = Mixpanel::Tracker.new("XXXXXXX") 

    @tracker.track(status.id, 'Tweets Received', { 'Hashtag' => tag, 'Message' => msg }) 

    puts 'Your code ran' 
    end 
+0

La réponse sur Cela dépend de la configuration de votre serveur de production. Mais essentiellement, cela impliquerait de le déléguer à un processus séparé et de le faire fonctionner à côté de votre application principale. Une façon de le faire serait de mettre cela dans une tâche de rake, puis d'appeler cette tâche pour démarrer un processus séparé. – Kelseydh

+0

Ce code devrait fonctionner périodiquement ou devrait-il être déclenché à partir de l'application principale? –

+0

@OleksandrAvoyants cela devrait être déclenché à partir de l'application principale. – Twhitt06

Répondre

0

Vous pouvez faire une tâche de râteau. Remplacez l'espace de nom myappname par le nom de votre application.

sauvegardera dans myappname/lib/tâches/tweetstream.rake:

namespace :myappname do 
    task :tweetstream => :environment do 

    require 'tweetstream' 
    require 'twitter' 
    require 'mixpanel-ruby' 

    TweetStream.configure do |conf| 
    conf.consumer_key = "XXXXXXX" 
    conf.consumer_secret = "XXXXXXX" 
    conf.oauth_token = "XXXXXXX" 
    conf.oauth_token_secret = "XXXXXXX" 
    conf.auth_method = :oauth 
    end 

    @store_account = Twitter::REST::Client.new do |config| 
    config.consumer_key = "XXXXXXX" 
    config.consumer_secret = "XXXXXXX" 
    config.access_token = "XXXXXXX" 
    config.access_token_secret = "XXXXXXX" 
    end 

    client = TweetStream::Client.new 

    client.track('mysampletweet') do |status| 

    msg = status.text 
    tag = "#mysampletweet" 

    puts msg 
    puts tag 

    if msg.include? tag 
    message = "@#{status.user.screen_name} Happy Holidays from @myaccountname!" 
    sleep 5 
    @store_account.update(message, in_reply_to_status_id: status.id) 
    end 

    @tracker = Mixpanel::Tracker.new("XXXXXXX") 

    @tracker.track(status.id, 'Tweets Received', { 'Hashtag' => tag, 'Message' => msg }) 

    puts 'Your code ran' 
    end 
    end 
end 

ensuite pour démarrer dans un processus séparé, à partir de votre ligne de commande, vous pouvez l'exécuter avec bundle exec rake myappname:tweetstream

+0

merci pour la suggestion. Je suis nouveau sur les rails, comment est-ce que je ferais démarrer la tâche de rake à partir de mon application? – Twhitt06

+0

J'ai mis à jour la réponse pour montrer où vous pourriez enregistrer ce fichier. Pour exécuter à partir de la ligne de commande, vous exécutez avec 'rake myappname: tweetstream', avec' myappname' dans tous les endroits étant remplacé par le nom de votre application rails. Lorsque vous configurez un processus séparé pour la production, vous pouvez appeler cette tâche rake une fois ou l'appeler périodiquement si vous avez un processus de planification. – Kelseydh

+0

Ah je ne voyais pas que vous vouliez déclencher cela depuis votre application. Une autre approche consiste à en faire un objet de service au sein de votre application, que vous pouvez ensuite appeler à partir de votre application pour déclencher un processus distinct pour la gérer à l'aide de DelayedJob, Sidekiq ou Resque. – Kelseydh