Активные задания выдают непредвиденную ошибку

Я пытаюсь заставить active_job работать с delayed_job. Все работает нормально... так как в коде выполняется как положено, но запись delayed_job сообщает, что произошла ошибка. Ошибка, которую я получаю, приведена ниже.

uninitialized constant ProcessEventJob 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `const_get' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:261:in `block in constantize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:259:in `each' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:259:in `inject' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/inflector/methods.rb:259:in `constantize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activesupport-4.2.1/lib/active_support/core_ext/string/inflections.rb:66:in `constantize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activejob-4.2.1/lib/active_job/core.rb:25:in `deserialize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activejob-4.2.1/lib/active_job/execution.rb:20:in `execute' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/activejob-4.2.1/lib/active_job/queue_adapters/delayed_job_adapter.rb:34:in `perform' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/backend/base.rb:94:in `block in invoke_job' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/backend/base.rb:91:in `invoke_job' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:204:in `block (2 levels) in run' 
/home/getsmart/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:89:in `block in timeout' 
/home/getsmart/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:99:in `call' 
/home/getsmart/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/timeout.rb:99:in `timeout' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:204:in `block in run' 
/home/getsmart/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/benchmark.rb:303:in `realtime' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:203:in `run' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:280:in `block in reserve_and_run_one_job' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:280:in `reserve_and_run_one_job' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:187:in `block in work_off' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:186:in `times' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:186:in `work_off' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:150:in `block (4 levels) in start' 
/home/getsmart/.rvm/rubies/ruby-2.2.2/lib/ruby/2.2.0/benchmark.rb:303:in `realtime' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:149:in `block (3 levels) in start' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:148:in `block (2 levels) in start' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:147:in `loop' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:147:in `block in start' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/plugins/clear_locks.rb:7:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/plugins/clear_locks.rb:7:in `block (2 levels) in <class:ClearLocks>' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `block (2 levels) in add' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:61:in `block in initialize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:79:in `block in add' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:66:in `execute' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/lifecycle.rb:40:in `run_callbacks' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/worker.rb:146:in `start' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:124:in `run' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:112:in `block in run_process' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/application.rb:265:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/application.rb:265:in `block in start_proc' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/daemonize.rb:84:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/daemonize.rb:84:in `call_as_daemon' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/application.rb:269:in `start_proc' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/application.rb:295:in `start' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/controller.rb:56:in `run' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons.rb:193:in `block in run_proc' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/cmdline.rb:88:in `call' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons/cmdline.rb:88:in `catch_exceptions' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/daemons-1.2.2/lib/daemons.rb:192:in `run_proc' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:110:in `run_process' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:91:in `block in daemonize' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:89:in `times' 
/home/getsmart/.rvm/gems/ruby-2.2.2@phoenix/gems/delayed_job-4.0.6/lib/delayed/command.rb:89:in `daemonize' bin/delayed_job:5:in `<main>'

ProcessEventJob — это мой рабочий класс, который сидит в app/jobs/process_event_job.rb.

class ProcessEventJob < ActiveJob::Base
  queue_as :event_handler_cycle

  def perform(event)
    Events::EventHandler.new(raw_data: event).call
  end
end

я звоню с

ProcessEventJob.perform_later(params)

Я перезапустил сервер и delayed_jobs. Убедитесь, что он работает с правильными переменными среды. Не совсем уверен, что еще делать. Я также могу получить доступ к ProcessEventJob из консоли.

Я думал, что файлы в папке приложения автоматически требуются.

Любые мысли о том, как отладить это, будут оценены.

ИЗМЕНИТЬ

Обратите внимание, что приведенный ниже код вызывает отложенное задание. Это открытая конечная точка, которую мы используем для захвата событий.

module Api
  module V1
    class SegmentEventsController < ApiController
      def create
        begin
          ProcessEventJob.perform_later(params)
          render_success
        rescue StandardError => e
          render_fail
        end
      end

      private

      def render_success
        render status: 200, json: { "success" => "true" }
      end

      def render_fail
        render status: 400, json: { "success" => "false" }
      end

      def restrict_access
        unless ApiKey.exists?(access_token: params[:access_token])
          head :unauthorized
        end
      end
    end
  end
end


Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # Code is not reloaded between requests.
  config.cache_classes = true

  # Eager load code on boot. This eager loads most of Rails and
  # your application in memory, allowing both threaded web servers
  # and those relying on copy on write to perform better.
  # Rake tasks automatically ignore this option for performance.
  config.eager_load = true

  # Full error reports are disabled and caching is turned on.
  config.consider_all_requests_local       = false
  config.action_controller.perform_caching = true

  # Enable Rack::Cache to put a simple HTTP cache in front of your application
  # Add `rack-cache` to your Gemfile before enabling this.
  # For large-scale production use, consider using a caching reverse proxy like nginx, varnish or squid.
  # config.action_dispatch.rack_cache = true

 # Disable Rails's static file server (Apache or nginx will already do this).
  config.serve_static_files = false

  # Compress JavaScripts and CSS.
  config.assets.js_compressor = :uglifier
  config.assets.css_compressor = :sass

  # Do not fallback to assets pipeline if a precompiled asset is missed.
  config.assets.compile = false

  # Generate digests for assets URLs.
  config.assets.digest = true

  # `config.assets.precompile` has moved to config/initializers/assets.rb

  # Specifies the header that your server uses for sending files.
  # config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache
  # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for nginx

  # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
  # config.force_ssl = true

  # Set to :debug to see everything in the log.
  config.log_level = :info

  # Prepend all log lines with the following tags.
  # config.log_tags = [ :subdomain, :uuid ]

  # Use a different logger for distributed setups.
  # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new)

  # Use a different cache store in production.
  # config.cache_store = :mem_cache_store

  # Enable serving of images, stylesheets, and JavaScripts from an asset server.
  # config.action_controller.asset_host = "http://assets.example.com"

  # Precompile additional assets.
  # application.js, application.css, and all non-JS/CSS in app/assets folder are already added.
  # config.assets.precompile += %w( search.js )

  # Ignore bad email addresses and do not raise email delivery errors.
  # Set this to true and configure the email server for immediate delivery to raise delivery errors.
  config.action_mailer.raise_delivery_errors = false
  config.action_mailer.default_url_options = { :host => 'mywebsite.co.za' }
  config.action_mailer.perform_deliveries = true
  config.action_mailer.delivery_method = :smtp
  config.action_mailer.smtp_settings = {
      :address              => "smtp.gmail.com",
      :port                 => 587,
      :user_name            => 'email',
      :password             => 'password',
      :authentication       => 'plain',
      :enable_starttls_auto => true  }

  # Enable locale fallbacks for I18n (makes lookups for any locale fall back to
  # the I18n.default_locale when a translation cannot be found).
  config.i18n.fallbacks = true

  # Send deprecation notices to registered listeners.
  config.active_support.deprecation = :notify

  # Disable automatic flushing of the log to improve performance.
  # config.autoflush_log = false

  # Use default logging formatter so that PID and timestamp are not suppressed.
  config.log_formatter = ::Logger::Formatter.new

  # Do not dump schema after migrations.
  config.active_record.dump_schema_after_migration = false

  config.active_job.queue_adapter = :delayed_job
end

ИЗМЕНИТЬ

Итак, я, кажется, добился некоторого прогресса, но это все еще не имеет смысла. В моей настройке на постановке запущено несколько приложений. Два из них используют delayed_jobs.

Я подумал, что, возможно, между ними происходит какой-то конфликт, поэтому я остановил ненужные мне delayed_jobs, и внезапно все заработало правильно. Я наткнулся на пост, в котором говорится, что у вас может быть два экземпляра работает, если вы используете -i ...

Я не совсем уверен, что это то, что я ищу.


person Ryan-Neal Mes    schedule 15.07.2015    source источник
comment
откуда вызывается ProcessEventJob?   -  person Marcelo Boeira    schedule 15.07.2015
comment
см. редактирование, откуда оно вызывается.   -  person Ryan-Neal Mes    schedule 15.07.2015
comment
Это работает, если вы вручную требуете process_event_job.rb, возможно, в инициализаторе?   -  person zetetic    schedule 16.07.2015
comment
Это не работает. Дайте мне знать, если я могу предоставить дополнительную информацию.   -  person Ryan-Neal Mes    schedule 16.07.2015


Ответы (1)


У вас есть config.active_job.queue_adapter = :delayed_job в application.rb ?

У меня есть этот файл script/delayed_job, содержащий

#!/usr/bin/env ruby

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

Затем на сервере введите каталог вашего проекта и запустите

RAILS_ENV=staging bundle exec script/delayed_job start
person Chris    schedule 16.07.2015
comment
да. это не работает. Он отлично работает на наших локальных машинах, но мы просто не можем заставить его работать в нашей промежуточной среде. - person Ryan-Neal Mes; 16.07.2015
comment
можете ли вы вставить команду, которую вы используете для запуска delayed_job на стадии подготовки? - person Chris; 16.07.2015