0

在我的Rails應用程序中,我將ActiveJob設置爲使用Resque。我創建了這個工作,傳送iOS推與grocer寶石通知:Resque作業無法連接到外部主機

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 

當此作業拿起Resque日誌的輸出是:

** [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> 

然後發生異常:

** [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> 

這是我知道的:

  1. 正在設置網關URL。
  2. 正確設置環境變量。
  3. 這項工作使用perform_now而不是perform_later

最後,這不是grocer的問題。我創建了一個簡單的登錄URL的源高就:

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 

在Rails的控制檯運行TestExternalConnectionJob.perform_later('http://stackoverflow.com')產生這樣的輸出在Resque日誌:

** [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)> 

所以,TL;博士,無我的Resque作業能夠連接到外部服務。

附錄

lib/resque.rake文件:

require 'resque/tasks' 

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

config/initializers/resque.rb文件:

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 } 

回答

2

好了,寫一個問題是時間的巨大浪費。

出於某種原因,在重新啓動並重新啓動我的所有進程後,我能夠連接到外部主機。

此前,我重啓過程很多次而沒有重新啓動。我正在使用eye來管理它們,所以在試圖解決這個問題時我多次發出eye restart命令來重新啓動我的應用依賴的所有進程(postgres,redisresque-worker)。每次重啓後,我都會得到相同的錯誤。

但不知何故,重新啓動的伎倆。

電腦有時候很奇怪。