0

In meiner Rails-App habe ich ActiveJob eingerichtet, um mit Resque zu arbeiten. Ich habe den Job erstellt iOS Push-Benachrichtigungen mit dem grocer gem senden:Resume-Jobs können keine Verbindung zu externen Hosts herstellen

class SendPushNotificationJob < ActiveJob::Base 
    queue_as :default 

    def perform(device_token, msg) 
    # TODO: Move the grocer initialization somewhere else. 
    pusher = Grocer.pusher(
     certificate: ENV['PUSH_CERT_PATH'], 
     passphrase: ENV['PUSH_CERT_KEY'], 
     gateway:  "gateway.sandbox.push.apple.com", 
     port:  2195, 
     retries:  3 
    ) 

    Resque.logger.debug "PUSHER OBJECT IS #{pusher.inspect}!" 

    notification = Grocer::Notification.new(
    device_token: device_token, 
    alert: msg) 

    Resque.logger.debug "NOTIFICATION OBJECT IS #{notification.inspect}" 

    res = pusher.push(notification) 

    Resque.logger.debug "PUSH RESULT IS #{res.inspect}" 
    end 
end 

Der Ausgang des Resque Protokoll, wenn dieser Job aufgenommen wird ist:

** [22:08:31 2016-07-06] 24074: Found job on default 
** [22:08:31 2016-07-06] 24074: got: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"SendPushNotificationJob", "job_id"=>"c88619a4-d2ea-4b27-a3c8-3ea5be04a130", "queue_name"=>"default", "arguments"=>["<my_device_token>", "Test message"], "locale"=>"en"}]) 
** [22:08:31 2016-07-06] 24074: resque-1.26.0: Processing default since 1467860911 [ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper] 
** [22:08:31 2016-07-06] 24074: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"SendPushNotificationJob", "job_id"=>"c88619a4-d2ea-4b27-a3c8-3ea5be04a130", "queue_name"=>"default", "arguments"=>["<my_device_token>", "Test message"], "locale"=>"en"}])] 
** [22:08:31 2016-07-06] 24074: resque-1.26.0: Forked 24092 at 1467860911 
** [22:08:31 2016-07-06] 24092: Running after_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"SendPushNotificationJob", "job_id"=>"c88619a4-d2ea-4b27-a3c8-3ea5be04a130", "queue_name"=>"default", "arguments"=>["<my_device_token>", "Test message"], "locale"=>"en"}])] 
** [22:08:31 2016-07-06] 24092: PUSHER OBJECT IS #<Grocer::Pusher:0x007f862152f4f0 @connection=#<Grocer::Connection:0x007f862152f630 @certificate="<cert path>", @passphrase="<passphrase>", @gateway="gateway.sandbox.push.apple.com", @port=2195, @retries=3>>! 
** [22:08:31 2016-07-06] 24092: NOTIFICATION OBJECT IS #<Grocer::Notification:0x007f8627a23f00 @identifier=0, @device_token="<my_device_token>", @alert="Test message", @encoded_payload=nil> 

Dann wird die Ausnahme passiert:

** [22:08:31 2016-07-06] 24092: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"SendPushNotificationJob", "job_id"=>"c88619a4-d2ea-4b27-a3c8-3ea5be04a130", "queue_name"=>"default", "arguments"=>["<my_device_token>", "Test message"], "locale"=>"en"}]) failed: #<SocketError: getaddrinfo: nodename nor servname provided, or not known> 

Hier ist, was ich weiß:

  1. Die Gateway-URL wird ordnungsgemäß festgelegt.
  2. Die Umgebungsvariablen sind korrekt festgelegt.
  3. Dieser Job funktioniert, wenn perform_now anstelle von perform_later verwendet wird.

Schließlich ist dies kein Problem mit grocer. Ich habe einen anderen Job, der einfach die Quelle einer URL protokolliert:

class TestExternalConnectionJob < ActiveJob::Base 
    queue_as :default 

    def perform(url) 
    res = HTTParty.get(url) 

    if res 
     Resque.logger.debug "SUCCESS" 
     Resque.logger.debug res.body 
    else 
     Resque.logger.debug "FAILURE"  
    end 
    end 
end 

Lauf TestExternalConnectionJob.perform_later('http://stackoverflow.com') in der Rails-Konsole erzeugt diese Ausgabe im Resque Protokoll:

** [22:14:41 2016-07-06] 24285: Found job on default 
** [22:14:41 2016-07-06] 24285: got: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"TestExternalConnectionJob", "job_id"=>"523da5ca-2b6c-452e-95ef-33edece69996", "queue_name"=>"default", "arguments"=>["http://stackoverflow.com"], "locale"=>"en"}]) 
** [22:14:41 2016-07-06] 24285: resque-1.26.0: Processing default since 1467861281 [ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper] 
** [22:14:41 2016-07-06] 24285: Running before_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"TestExternalConnectionJob", "job_id"=>"523da5ca-2b6c-452e-95ef-33edece69996", "queue_name"=>"default", "arguments"=>["http://stackoverflow.com"], "locale"=>"en"}])] 
** [22:14:41 2016-07-06] 24285: resque-1.26.0: Forked 24300 at 1467861281 
** [22:14:41 2016-07-06] 24300: Running after_fork hooks with [(Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"TestExternalConnectionJob", "job_id"=>"523da5ca-2b6c-452e-95ef-33edece69996", "queue_name"=>"default", "arguments"=>["http://stackoverflow.com"], "locale"=>"en"}])] 
** [22:14:41 2016-07-06] 24300: (Job{default} | ActiveJob::QueueAdapters::ResqueAdapter::JobWrapper | [{"job_class"=>"TestExternalConnectionJob", "job_id"=>"523da5ca-2b6c-452e-95ef-33edece69996", "queue_name"=>"default", "arguments"=>["http://stackoverflow.com"], "locale"=>"en"}]) failed: #<SocketError: Failed to open TCP connection to stackoverflow.com:80 (getaddrinfo: nodename nor servname provided, or not known)> 

So tl; dr, keine meiner Resque-Jobs können sich mit externen Diensten verbinden.

Anhang

Meine lib/resque.rake Datei:

require 'resque/tasks' 

namespace :resque do 
    task :setup => :environment do 
    require 'resque' 
    end 
end 

Meine config/initializers/resque.rb Datei:

require 'resque' 

Resque.redis = Redis.new(url: 'redis://127.0.0.1:6379') 
Resque.logger = Logger.new(Rails.root.join('log', "#{Rails.env}_resque.log")) 
Resque.logger.level = Logger::DEBUG 
Resque.after_fork = Proc.new { ActiveRecord::Base.establish_connection } 

Antwort

2

Nun, war diese Frage schriftlich eine enorme Zeitverschwendung.

Aus irgendeinem Grund konnte ich nach einem Neustart und dem Neustart aller Prozesse eine Verbindung zu externen Hosts herstellen.

Zuvor hatte ich die Prozesse oft ohne Neustart neu gestartet. Ich benutze eye, um sie zu verwalten, also habe ich mehrmals beim Versuch, dies zu lösen, einen eye restart Befehl ausgegeben, um alle Prozesse neu zu starten, von denen meine App abhängt (postgres, redis und resque-worker). Jedes Mal nach dem Neustart würde ich den gleichen Fehler bekommen.

Aber irgendwie hat ein Neustart den Trick gemacht.

Computer sind manchmal komisch.