2016-04-15 59 views
0

首次设置延迟作业,并且在执行RailsCast后,它不能在我的测试环境中工作。延迟作业失败,无日志或提醒

我有两种方法,我想运行 - 在测试中,我想在页面加载后15秒运行它们。这些方法是来自Participation.rb模型的calculate_rankingsupdate_wallet

安装每个引导创业板上面之后,我想两件事情调试:1)我正在rake jobs:work,那里是Starting job worker后无输出,和2)我已经添加了警报到我的控制器的方法,该方法不激活。

后宝石安装和运行迁移(这是成功的),我已经在代码中做了两处更改。

  1. 创建应用程序/工作/ chipsupdater.rb

这是错误。该文件被错误地命名,因此在控制器中没有正确调用。根据我在下面写的方法,应该是app/jobs/chips_update_job.rb

 class ChipsUpdaterJob < Struct.new(:game_id) 
     def perform 
      Participation.calculate_ranking(game_id) 
      Participation.update_wallet(game_id) 
     end 
     end 
  • 更新我的ScoreboardController,我要初始化延迟工作:

    class ScoreboardController < ApplicationController 
        def index 
    
        @participations = Participation.where(finished: true, game_id: session[:game_id]).order(score: :desc).limit(10) 
        @game = Game.find(params[:game_id]) 
        end 
    def chipsupdater 
        Delayed::Job.enqueue(ChipsUpdaterJob.new(params[:game_id]), :run_at => 1.minute.from_now) 
        flash[:notice] = "Things are good. Not broken." 
        end 
    end 
    
  • 随着作业没有闪光灯警报或输出控制台,我的信念是我没有正确地调用延迟作业。你能发现我出错的地方吗(或者为什么我不能使用作业控制台进行调试)?

    编辑

    每注释中的讨论,我现在运行在测试环境中的工人。但是,我仍然无法a)将作业发布到我的DelayedJobs表或b)实现我们的关键输出,即在ChipsUpdater作业文件中使用这两种方法。

    因此,我的观点是,我无法根据此故障正确调用延迟的作业。

    对于上下文,我想包含两个更多可能相关的文件。

    首先,这里是在ChipUpdaterJob引用的参与模式:

    class Participation < ActiveRecord::Base 
    
    ef self.calculate_ranking(game_id) 
         records = Participation.where(game_id: game_id, finished: true).order('score DESC, updated_at ASC') 
    
         records.each_with_index do |record, index| 
         puts "rank: #{index + 1}" 
         puts record.inspect 
         puts record['score'] 
         puts record['user_id'] 
         puts record['game_id'] 
    
         Ranking.create(game_id: game_id, user_id: record['user_id'], game_time: record['updated_at'], ranking: index + 1) 
        end 
        end 
    

    如果取出延迟上下文和运行从记分板控制器正常的方法,我在当地证实,它成功运行排名过程。延迟似乎是失败的。

    /斌/ delayed_job的

    require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 
    
    require 'delayed/command' 
    Delayed::Command.new(ARGV).daemonize 
    
    +0

    对于任何检查这一点,delayed_job的不正确的,因为我有我的工作文件夹中的不正确命名的文件发布。下划线是正确调用控制器中类的关键。 – darkginger

    回答

    2

    如果youre设法在您的测试环境中运行的工作,那么你运行rake命令

    RAILS_ENV=test bundle exec rake jobs:work

    也时需要设置环境,请尝试打印而不是使用Flash通知。一个打印将更可能出现在您从

    运行该作业的选项卡上您可以确认您实际上在您的测试之一去chipsupdater路线?

    +0

    谢谢。我现在至少看到错误。当我尝试在我的测试环境中加载worker时,出现以下错误:'ctiveRecord :: StatementInvalid:SQLite3 :: SQLException:no such table:delayed_jobs:SELECT“delayed_jobs”。* FROM“delayed_jobs”WHERE((run_at <='2016-04-15 18:22:39.093284'AND(locked_at IS NULL OR locked_at',即使我已经加载了'delayedjobs'表并且从他们的GitHub迁移了 – darkginger

    +0

    您还需要运行安装后延迟这个错误告诉你你的测试数据库没有延迟的作业表(这是安装后迁移创建的) – PhilVarg

    +0

    好了,感谢你的建议,现在一切都在测试环境中加载。 ,当到达我的Scoreboard控制器时,后台作业仍然没有在指定的时间激活,并且工作人员保持空闲状态,我认为你是正确的 - 我没有任何'chipsupdater'类方法的路由。称之为在我的工作文件? – darkginger

    0

    你加这一行到config/application.rb中

    config.active_job.queue_adapter = :delayed_job